标签:
找出字符串中没有相同字符的的最长串
注意这里的 Characters指的是字符,不是字母,就是说|/?~这样的字符都会出现,所以要用到ASCII码
最简单的方法是,从第一个字符开始,往后一个个判断,里面有没有重复的字符,如果重复了则记录下长度。
例如:abcabcbb
第一次:abc 重复于a 长度3
第二次:bca 重复与b 长度3
第三次:cab 重复与c 长度3
......
但这种方法很耗时
如果是 abcdefghijk这种
第一次就找到了的 abcdefghijk
但还要第二次往后 bcdefghijk 第三次的cdefghijk ......
一个改进的方法是
也是从头往后一个个判断,但是不是头一个个的往后,而是如果有重复的字符,则找到字符串中的重复字符,以该字符的下一个字符为头开始判断。
例如:
abcdefgfb
第一次的adcdefg 重复于f
就从g开始:gfb
因为肯定要从重复字符的后一个开始啊,前面的都包含了这个字符了,后面一定会重复的啦。
要边判断的同时边记录大小,判断的话用一个127大小的int数组判断,如果出现过该字符,就使数组元素为1:
public class Solution { public int lengthOfLongestSubstring(String s) { int head=0; int tail=0; int length = s.length(); int max = 0; int temp = 0; while(head<length){ temp = 0; int [] record = new int [127]; tail=head; //如果没有出现过 while(tail<length&&record[(int)(s.charAt(tail))]==0){ //System.out.print(s.charAt(tail)); record[(int)(s.charAt(tail))]=1; tail++; temp++; } //System.out.println(); if(temp>max) max=temp; //跳出循环 即是说已经出现了重复的字符了 //或者已经到句末了 if(tail>=length) break; if(tail<length){ char chongfu = s.charAt(tail); //System.out.println(chongfu+"!"); //把head一直移到出现过的字符后面 while(s.charAt(head)!=chongfu){ head++; } head++; } } //System.out.println(max); return max; } }
LeetCode题解 #3 Longest Substring Without Repeating Characters
标签:
原文地址:http://www.cnblogs.com/wzben/p/5143311.html