leetcode3 最長不重複子串
解題思路
使用vector<int>(256,-1)
來記錄每一個字符上一次出現的位置。使用兩個指針,前指針start
和後指針i
來指向當前檢測的子串。i
從頭開始遍歷字符串。
- 如果
s[i]
在位置k
出現過,且start < k
,那麼i - k
就是一個不重複子串; - 如果
s[i]
在start
之後沒有出現過,則i - start
就是一個不重複字符串;
時間複雜度爲O(n)。
代碼
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> dict(256, -1);
int maxLen = 0, start = -1, size = s.size();
for(int i = 0; i < size; i++) {
if(dict[s[i]] > start) {
start = dict[s[i]]; // 更新前指針爲k
}
dict[s[i]] = i; // 更新s[i]上一次出現的位置
maxLen = max(maxLen, i - start);
}
return maxLen;
}
};