前端中等算法-無重複字符的最長子串

無重複字符的最長子串

難度:中等

描述:

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

樣例:

  • 輸入: "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) {
}

代碼:

  1. 用對象儲存字符的位置, 出現重複字符時更新不重複字符的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;
};
  1. 從左到右,一個字符一個字符搜索,看是否重複。
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 -->

點個Star支持我一下~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章