面試題48 最長不含重複字元的子字串(C )

2021-10-13 01:31:18 字數 1388 閱讀 7714

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

暴力法:將字串中的每個字元儲存到字串ss中,然後判斷字串s中的每個字元是否出現在字串ss中,即是否重複。

雜湊表:使用雜湊表記錄每個字元的下乙個索引,然後向右移動右指標right來拓展滑動視窗的大小,並更新視窗的最大長度res。如果右指標right指向的元素s[right]重複,則將左指標left直接移動到視窗中重複元素的右側。

set去重:使用set對字串s去重,如果當前字元未出現在set中,則end右移,並把該字元插入set中,否則遇到重複元素,則從set中刪除。

雙指標:使用快慢指標,從左往右移動滑動視窗,判斷快指標right指向的元素是否出現在滑動視窗內,如果視窗內沒有該元素,則將該元素加入滑動視窗,同時更新視窗長度最大值,否則如果視窗存在該元素,即遇到重複元素,移動慢指標left,直到視窗中不包含該元素。

暴力

class solution 

if(ss.size() > res) res = ss.size();

}return res;}};

雜湊表

class solution 

mp[s[right]] = right;

right++;

res = max(right - left, res);

}return res;}};

set去重

class solution 

count_ch.insert(s[i]);

end++;

res = max(end - begin, res);

}return res;}};

雙指標

class solution 

res = max(i - right + 1, res);

}return res;}};

參考文章

面試題48 最長不含重複字元的子字串

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含a z的字元。例如,在字串 arabcacfr 中,最長的不含重複字元的子字串是 acfr 長度為4。我們定義函式f i 表示以第i個字元為結尾的,不包含重複字元的子字串的最長長度。我們從左到右逐一掃瞄字串中的每...

面試題48 最長不含重複字元的子字串

題目描述 請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pw...

面試題48 最長不含重複字元的子字串

題目 請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。示例 示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 p...