題目描述
給定一個字符串 s 吞瞪,請你找出其中不含有重復字符的 最長子串 的長度。
示例 1:
輸入: s = "abcabcbb"
輸出: 3
解釋: 因為無重復字符的最長子串是
"abc"养匈,所以其
長度為 3。
示例 2:
輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是
"b"
都伪,所以其長度為 1呕乎。
示例 3:
輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是
"wke"
,所以其長度為 3陨晶。
請注意猬仁,你的答案必須是 子串 的長度,
"pwke"
是一個子序列珍逸,不是子串逐虚。
題目解析
- 重點是子串聋溜,不是子序列谆膳,所以可以思考用滑動窗口來解決
- 另外一個重點說無重復的,所以可以使用hashmap將字母和位置進行緩存撮躁。
- 執(zhí)行過程:
當前字符串不在hashmap中漱病,長度積累
當前字符串在hashmap中時,長度為當前位置減去上次該字符出現(xiàn)的位置把曼,得到公式
ans = max(ans杨帽, i - map[s.charAt(i)] + 1)
代碼
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int ans = 0;
int startIndex = 0;
for(int i = 0; i < s.length(); i++) {
if(map.containsKey(s.charAt(i))) {
startIndex = Math.max(startIndex, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
ans = Math.max(ans, i - startIndex + 1);
}
return ans;
}