無重複字符的最長子串
難度:中等
描述:
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
樣例:
- 輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
- 輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
- 輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
- 輸入: "dvdf"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "vdf",所以其長度爲 3。
- 輸入: "asjrgapa"
輸出: 6
解釋: 因爲無重複字符的最長子串是 "sjrgap",所以其長度爲 6。
- 輸入: "aabaab!bb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "ab!",所以其長度爲 3。
- 輸入: "abcb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
- 輸入: "asljlj"
輸出: 4
解釋: 因爲無重複字符的最長子串是 "aslj",所以其長度爲 4。
- 輸入: "qwnfenpglqdq"
輸出: 8
解釋: 因爲無重複字符的最長子串是 "fenpglqd",所以其長度爲 8。
思路分析:
關鍵在於在出現重複字符時,如何更新不重複字符的index
代碼模板:
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
}
想
一
想
再
看
答
案
代碼:
- 用對象儲存字符的位置, 出現重複字符時更新不重複字符的index。
var lengthOfLongestSubstring = function (s) {
let obj = {}; // 用於儲存字符出現的位置
let res = 0; // 最大值
let j = 0; // 不重複字符的index
for (let i = 0; i < s.length; i++) {
// 當前值是否在對象中存儲過
const value = obj[s[i]]
if (value !== undefined) {
// 更新上一次重複值的index
// value + 1 跳過之前重複的字符
// j: 之前不重複的index 重複字符 需要全部跳過
j = Math.max(value + 1, j)
}
// 每個字符都計算一下最長不重複值 保存最大值
// 不重複最長長度 = 當前index - 上一次重複值的index + index從0開始 長度從1開始
res = Math.max(res, i - j + 1);
// 存/更新 字符串index
obj[s[i]] = i
}
return res;
};
- 從左到右,一個字符一個字符搜索,看是否重複。
var lengthOfLongestSubstring = function (s) {
var i = 0, // 不重複字符的index
res = 0; // 更新無重複字符的長度
for (j = 0; j < s.length; j++) {
// 查找:不重複字符-當前index之間 有沒有出現當前字符
let index = s.slice(i, j).indexOf(s[j])
if (index === -1) {
// 更新無重複字符的長度:當前index-不重複字符的index + 長度從1開始算
res = Math.max(res, j - i + 1);
} else {
// 更新i = 不重複字符的index
// 不重複字符的index = 原不重複的字符index + i-j中出現重複字符的index + 跳過該重複字符
i = i + index + 1;
}
}
return res;
};
<!-- 特殊字符串:用於修改/刪除markdown的結尾提示語-OBKoro1 -->