3. 無重複字元的最長子串
題目連結:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked
題目難度:中等
標籤:雜湊表
、字串
、滑動視窗
題目狀態:學習題解
思路:
滑動視窗的思路,也就是維持一個無序佇列unordered_set<char>
用來當作這個視窗。
- 遍歷字串,若當前字元不在視窗中,就將該字元
insert
進視窗中,然後將長度加1。 - 若當前字元在視窗中,就將視窗的左側元素移除,這樣就實現了移動這個視窗。然後判斷當前的子串長度是否大於之前的長度。
當遍歷結束,就獲得了子串的最大長度。
程式碼:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0) return 0;
unordered_set<char> window;
int maxStr = 0;
int left = 0;
for(int i = 0; i < s.size(); ++i) {
while(window.find(s[i]) != window.end()) {
window.erase(s[left]);
left++;
}
maxStr = max(maxStr, i - left + 1);
window.insert(s[i]);
}
return maxStr;
}
};
438. 找到字串中所有字母異位詞
題目連結:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked
題目難度:中等
標籤:雜湊表
、字串
、滑動視窗
題目狀態:學習題解
思路:
這題使用滑動視窗解決,滑動視窗的大小是p的大小。然後建立兩個26位的陣列,pCount和sCount,其中pCount儲存p的字母狀態,這個是固定的,用來與sCount進行比較的。sCount中儲存的是當前滑動視窗裡面的s的字母狀態。若pCount和sCount相等,則壓入結果陣列中。
程式碼:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int sLen = s.size(), pLen = p.size();
if(sLen < pLen) return vector<int>();
vector<int> ans;
vector<int> sCount(26);
vector<int> pCount(26);
for(int i = 0; i < pLen; ++i) {
++sCount[s[i] - 'a'];
++pCount[p[i] - 'a'];
}
if(sCount == pCount) ans.emplace_back(0);
for(int i = 0; i < sLen - pLen; ++i) {
--sCount[s[i] - 'a'];
++sCount[s[i + pLen] - 'a'];
if(sCount == pCount) ans.emplace_back(i + 1);
}
return ans;
}
};