給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-jie-suan-fa-3-wu-zhong-fu-zi-fu-de-zui-chang-z/
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
思路
標籤:滑動窗口
採取滑動窗口的方法降低時間複雜度
定義一個 map 數據結構存儲 (k, v),其中 key 值爲字符,value 值爲字符位置 +1,加 1 表示從字符位置後一個纔開始不重複
我們定義不重複子串的開始位置爲 start,結束位置爲 end
隨着 end 不斷遍歷向後,會遇到與 [start, end] 區間內字符相同的情況,此時將字符作爲 key 值,獲取其 value 值,並更新 start,此時 [start, end] 區間內不存在重複字符
無論是否更新 start,都會更新其 map 數據結構和結果 ans。
時間複雜度:O(n)O(n)
代碼
public static int getStringLength(String str) {
int ens = 0;
Map<Character, Integer> map = new LinkedHashMap<>();
for (int start = 0, end = 0; end < str.length(); end++) {
Character ch = str.charAt(end);
if (map.containsKey(ch)) {
ens = Math.max(end - start, ens);
start = map.get(ch);
}
map.put(ch, end + 1);
}
System.out.println("map" + JSON.toJSONString(map));
return ens;
}
public static void main(String[] args) {
String str = "abcabcdedbb";
int aaa = getStringLength(str);
System.out.println(aaa);
}
畫解