题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/
法一:暴力法
- 算法思想:从第一个元素开始找最长子串,按顺序一共找n次(n为字符串长度)。
- 注意:哈希表的key不能是string,要用char。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int max = 0;
// int p = 0;
for(int i = 0; i < s.size(); i++) {
int temp = 0;
unordered_map<char, int> hash;
for(int j = i; j < s.size(); j++) {
auto it = hash.find(s[j]);
if(it != hash.end()) {
break;
}else {
hash[s[j]] = j;
temp = temp + 1;
}
}
if (temp > max) {
max = temp;
}
}
return max;
}
};
法二:
- 可以发现当首字母索引增加时,最后的一个字母索引一定不变或增加。
- ”滑动窗口“思想:使用左右同向双指针,它们都只会向右移动,不会向左移或重启。
- 时间复杂度:O(n),虽然是双层循环,但是其中执行的最多的语句hash[s[p]] = p;和p++;,最多都只会执行n次。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int max = 0;
int p = 0;
int n = s.size();
unordered_map<char, int> hash;
for(int i = 0; i < n; i++) {
if(i > 0) {
hash.erase(s[i - 1]);
}
while(p < n && hash.find(s[p]) == hash.end()) {
hash[s[p]] = p;
p++;
}
max = p - i>max ? p-i:max;
}
return max;
}
};