題目
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度
示例
輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
代碼
解法一(很暴力)
在位置i,假設當前元素位置爲最長子串的末尾,往前比較,直到遇到與它相同的元素,用那個元素的位置更新index(往前比較的停止點),如果此時子串的長度大於最大長度,則更新長度。循環往後。
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null||s.length()==0){
return 0;
}
//只有一個字符
if(s.length()==1){
return 1;
}
//至少有兩個字符
int res = 0;
//index表示新子串的開頭(保證從index到當前位置之前沒有重複的字符)
int index = 0;
//從第2個字符開始往前找
for(int i=1;i<s.length();i++){
//從當前位置往前找,到index爲止,看字符是否重複
for(int j=i-1;j>=index;j--){
//有重複
if(s.charAt(j)==s.charAt(i)){
index = j+1;
res = Math.max(res,i-index+1);
break;
}
}
//沒有重複
res = Math.max(res,i-index+1);
}
return res;
}
}
解法二(也很暴力)
和解法一思路一樣,區別是遍歷一次字符串,藉助一個Hashmap
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null||s.length()==0){
return 0;
}
//記錄出現過的字符及其下標
HashMap<Character,Integer> map = new HashMap<>();
int res = 0;
//index表示新子串的開頭(保證從index到當前位置之前沒有重複的字符)
int index = 0;
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
//從index往後,看當前字符是否出現過,出現過則更新index
if(map.get(c)!=null&&map.get(c)>=index){
index = map.get(c)+1;
}
//沒出現過,則加入map
map.put(c,i);
// index 到 i 就是當前字符串,長度爲 i-index+1
res = Math.max(res,i-index+1);
}
return res;
}
}