【題目描述】
給定一個字符串 s ,請你找出其中不含有重復字符的 最長子串的長度。??
示例 1:
輸入: s = "abcabcbb"
輸出: 3?
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是 "wke",所以其長度為 3。
? ? ?請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、數字、符號和空格組成
【解題代碼】
package string;public class LengthOfLongestSubstring {public static void main(String[] args) {String s = "abcabcbb";int result = new LengthOfLongestSubstring().lengthOfLongestSubstring(s);System.out.println(result);}public int lengthOfLongestSubstring(String s) {int i = 0;int max = 0;StringBuilder sb = new StringBuilder(s);String subString = "";while (i < sb.length()){char ch = sb.charAt(i);int inx = subString.indexOf(ch);if (inx != -1) {if (max < subString.length()) max = subString.length();subString = subString.substring(inx + 1);}subString += ch;i++;}if (max < subString.length()) max = subString.length();return max;}
}
【解題思路】
? ? ? ? 根據題目描述和對示例進行分析,感覺這一題可以通過“滑動窗口”的算法進行處理,即定義兩個索引值i1,i2,i1,i2從0開始,i2向后滑動,判斷當前子字符串是否有重復字符,如果沒有不斷更新最大長度值,如果有的話,將i1設置為與最后一個字符重復的字符下一個索引值。按照這個思路,完成代碼編寫,并提交LeetCode成功
【解題步驟】
- 定義變量
int i = 0; int max = 0; StringBuilder sb = new StringBuilder(s); String subString = "";
- 從0開始,向后滑動獲取當前字符,一直到字符串結尾為止
while (i < sb.length()){char ch = sb.charAt(i);
- 判斷當前字符如果在子字符串中,那么當前計算當前子字符串長度,并更新長度最大值比較,然后重新調整下一個子字符串的開始索引
int inx = subString.indexOf(ch); if (inx != -1) {if (max < subString.length()) max = subString.length();subString = subString.substring(inx + 1); }
- 當前子字符串加上當前字符,并將自增滑動索引值
subString += ch; i++;
- 循環結束后,將當前子字符串和最大值進行比較更新,并返回最大值
if (max < subString.length()) max = subString.length(); return max;
【思考總結】
- 這道題的關鍵是“滑動窗口”的算法實現思路,不斷向后滑動尋找合理的無重復字符子串,并刷新長度最大值;
- 程序員對于字符串的操作,一定能非常精熟;
- LeetCode解題之前,一定不要看題解,看了就“破功”了!