#include<iostream>
#include<set>
#include<unordered_map>
#include<algorithm>
using namespace std;
class Solution {
public:
//用set(红黑树)
int lengthOfLongestSubstring(string s) {
std::set<char> set;
int res = 0, left = 0, right = 0;
while (right < s.size()) {
if (set.find(s[right]) == set.end()) { //如果没有该字符
set.insert(s[right++]); //插入字符
res = max(res, (int)set.size()); //更新res
}
else {
set.erase(s[left++]); //不断的删除该字符及其左边的所有字符
}
}
return res;
}
//用hash表
int lengthOfLongestSubstring2(string s) {
int res = 0, left = 0;
std::unordered_map<char, int> m;
for (int i = 0; i < s.size(); ++i) {
char ch = s[i];
left = max(left, m[ch]); //更新left,到该字符的下标,但是只能前进,不能后退
m[ch] = i + 1; //更新key的value
res = max(res, i - left + 1); //更新res
}
return res;
}
};
int main() {
Solution s;
std::cout<<s.lengthOfLongestSubstring2("abba");
return 0;
}
拓展: 1、字符串KMP匹配算法
参考:我的笔记-KMP算法