- 鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
- 代碼地址: https://github.com/xvusrmqj/CodeProblems/tree/master/src/main/java/leetcode_cn
題目:
給定一個(gè)字符串蚕礼,請(qǐng)你找出其中不含有重復(fù)字符的 最長(zhǎng)子串 的長(zhǎng)度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長(zhǎng)子串是 "abc"凡傅,所以其長(zhǎng)度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o重復(fù)字符的最長(zhǎng)子串是 "b"灌闺,所以其長(zhǎng)度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長(zhǎng)子串是 "wke"坏瞄,所以其長(zhǎng)度為 3桂对。
請(qǐng)注意,你的答案必須是 子串 的長(zhǎng)度鸠匀,"pwke" 是一個(gè)子序列蕉斜,不是子串。
解法:
private int lengthOfLongestSubstring(String s) {
int n = s.length();
HashSet<Character> set = new HashSet<>(n);
int maxLen = 0, i = 0, j = 0;
while (i <= n && j <= n) {
if (!set.contains(s.charAt(j))) {
set.add(s.charAt(j++));
maxLen = Math.max(maxLen, set.size());
} else {
set.remove(s.charAt(i++));
}
}
return maxLen;
}
總結(jié):
這題說明了一些問題缀棍,
- 如果沒有思路宅此,最開始可以用暴力法的思路(但是不要寫出來,浪費(fèi)時(shí)間)爬范,再去優(yōu)化暴力法(如有哪些地方重復(fù)計(jì)算了)父腕。
- 滑動(dòng)窗口可以算一個(gè)比較常用的抽象了,記住它青瀑。它使用索引i,j指向數(shù)組的兩端璧亮。最開始固定一端。注意不要兩端一起滑斥难,一定是只有一個(gè)滑動(dòng)(單一變量原則)枝嘶。
- Set是一個(gè)比較好的去重的選擇。