> “偶遇变态力扣周赛,拼尽全力无法战胜,力竭而亡,无奈去刷基础题,遂写下此题解”
题目大意
给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
思路
滑动窗口(不知道为啥最近和滑动窗口这么有缘),遍历右边界,每次移动更新左边界,确保窗口内不会出现重复元素。
如何更新左边界
开一个数组用于记录当前右边界字符出现的下标i,若下次遇到相同的字符则通过该数组直接将左节点更新至i+1;
如何记录字符所在的下标
方法一:利用ASCII表,开一个长度为128的数组;
方法二:利用unordered_map关联容器
【C++】unordered_map 容器的最全解析(什么是unordered_map?unordered_map的常用接口有那些?)
代码
点击查看代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int>m(128,0); // unordered_map<char,int> m;
int ans = 0;
int i = 0,n=s.size();
for (int j = 0; j < n; j++) {
i = max(i, m[s[j]]);
m[s[j]] = j + 1;
ans = max(ans, j - i + 1);
}
return ans;
}
};
感想
这不比摘樱桃的题解好写多了。kyiku的歌怎么这么好听
完