問題:給定一個字符串,找出最長的無重複元素的子串
例如:
“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;
}
}