3. 無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
解題思路: 一般看到字符串子串問題,我們會想到用雙指針解,看到字符串子序列問題,會想到用動態規劃解,i.e.,子串問題雙指針,子序列問題動態規劃。 此題也不例外,利用雙指針解,很快即可解題,主要的思路是,維護一個hashmap統計雙指針頁框內字符的頻數,雙指針(i和j)初始化狀態均位於左側,每次指針j向右移動一個位置,然後check這個位置的字符在頁框內出現的頻數超過1,若是則通過右移指針i使得頻數降爲1,雙指針在移動的過程中記錄子串最大長度。
// 雙指針,兩個指針(i,j)一開始均位於左側,指針j每次向右移動一個
// 若發現某個字符頻數超過1,則右移指針i,直至頻數爲1,遍歷的過程中
// 記錄子串最大長度
// Time:接近O(n), space:O(n)(最壞))
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.empty()) return 0;
int i = 0, j = 0, n = s.size(), res = 0;
unordered_map<char, int> mp;
while (j < n) {
++mp[s[j]];
while (i <= j && mp[s[j]] > 1) {
--mp[s[i]];
++i;
}
res = max(res, j - i + 1);
++j;
}
return res;
}
};
————————————
雙指針用法小結:
雙指針解法按雙指針位置分,一般有兩種,即雙指針同向移動(e.g.,初始狀態均位於左側,隨後向右側移動),雙指針相向移動(e.g.,初始狀態一個指針在左側,另一個指針右側,隨後兩個指針向中間移動)
雙指針解法的難點是,如何判斷當移動指針時,是哪個指針移動。
考慮清楚上面兩個問題後,雙指針解題就不難了。