问题:给定一个字符串,找出最长的无重复元素的子串
例如:
“bbbbbb”的子串为”b”
“abcabccd”的子串为”abc”
两种思路,一种是从头开始依次比较,例如:
字符串为:”abcabccd”,从第一个字符元素”a”开始,直到”abca”发现出现重复元素,则从第二个字符元素”b”开始重复上述操作,比较得到的长度,
class Solution {
public int lengthOfLongestSubstring(String s) {
int len =s.length();//字符串长度
if(len==0)return 0;
int maxlen = 1;//存储子串长度
int i=0;
while(true){
boolean flag[] = new boolean[256];//标记是否出现重复元素
int point = i+1;
flag [s.charAt(i)]= true;
while(point<len && !flag[s.charAt(point)]){//判断该字符元素是否出现过
flag[s.charAt(point)]=true;
if(maxlen<point-i+1){//判断是否找到更大的子串长度
maxlen = point-i+1;
}
point++;
}
i++;
//判断是否跳出循环
if(i>=len){
break;
}
}
return maxlen;
}
}
另一种思路是跳跃式比较,例如:
字符串为”abcbaccd”,一开始从第一个字符元素开始比较,到”abcb”发现出现重复字符元素”b”,这时候不从第二个字符元素”b”开始比较,因为比较后发现不会比前一个子串更长,这里从出现重复字符元素前一个该字符元素后一位开始比较,即从第三个字符元素”c”开始,降低时间复杂度。
class Solution {
public int lengthOfLongestSubstring(String s) {
int length = s.length();//字符串长度
if(length ==0){
return 0;
}
int start = 0;
int i = start;//每次比较的起始位置
int max = 1;//存储最长子串长度
while(i<length){
boolean flag[] = new boolean[256];//标记是否出现重复字符元素
for(;i<length;i++){
if(!flag[s.charAt(i)]){
flag[s.charAt(i)] = true;
if(max<i-start+1){
max = i-start+1;
}
}else{
start = s.indexOf(s.charAt(i),start)+1;//下次比较的起始点
i=start;
break;
}
}
}
return max;
}
}