3.无重复字符的最长字串
思路:使用滑动窗口的写法来写,设置一个map来存储当前窗口中已经出现的字符以及其对应的映射,初始窗口起点和最大长度均为0,然后外层循环中不断推进窗口的右端点,并且逐一更新窗口的最大值和当前存储map映射。如果在推进窗口右端点的时候,遇到重复的字符,则直接将窗口的左端点移到重复字符的下一个字符处,重新开始计算窗口。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> charIndex; // 存储字符及其索引
int maxLength = 0;
int start = 0; // 窗口的起始位置
for (int i = 0; i < s.size(); i++) {
// 如果字符已经在当前窗口中,更新窗口的起始位置
if (charIndex.find(s[i]) != charIndex.end() && charIndex[s[i]] >= start) {
start = charIndex[s[i]] + 1;
}
charIndex[s[i]] = i; // 更新字符的最新索引
maxLength = max(maxLength, i - start + 1); // 更新最大长度
}
return maxLength;
}
};
时间复杂度:O(n) (一开始以为是O(nlogn),然后突然意识到map是基于hash的,所以查找的时间复杂度应该是O(1),所以时间复杂度是O(1))
空间复杂度:O(n+m),m是建立hash表时,所预留的桶的个数,在stl中一般大于等于n。