leetcode c++ 中等题之无重复字符的最长子串
个人解答
int lengthOfLongestSubstring(string s) {
map<char, int> mymap;
int start = 0, end = 0;
int n = s.length();
int length = 0, result = 0;
while (end < n) {
char tmp = s[end];
if (mymap[tmp] && mymap[tmp] >= start) {
start = mymap[tmp];
mymap[tmp] = end + 1;
length = end - start;
}
mymap[tmp] = end + 1;
length++;
end++;
result = max(result, length);
}
return result;
}
官方答案
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> occ;
int n = s.size();
int rk = -1, ans = 0;
for (int i = 0; i < n; ++i) {
if (i != 0) {
occ.erase(s[i - 1]);
}
while (rk + 1 < n && !occ.count(s[rk + 1])) {
occ.insert(s[rk + 1]);
++rk;
}
ans = max(ans, rk - i + 1);
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetc-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
个人总结
- 这个题用滑动窗口较好理解 只要清楚知道执行的流程 就能很快写出代码 不过答案给出的代码我也没怎么看懂
- 我的方法中end取的是map中char处于s的哪个位置 而不是其下标 因为经测试 暂未存入map的字符对应val值为0 避免无法区分s的第一个字符与不存在的字符 故做此区别
- 还有代码注释中if中后半部分判断条件非常值得注意 为了防止我们的start回跳至已经被我们排除的区间中 故只有处于start右边位置的重复字符值得我们转跳(左边的已经被排除了 跳个屁) 我就是在这个条件这卡了很久很久 最后用用例“abba”才勉强意识到这个问题
- 下面列出未优化 且未意识到start不能会跳的代码 以做警示
int lengthOfLongestSubstring(string s) {
map<char, int> mymap;
int start = 0, end = 0;
int n = s.length();
int length = 0, result = 0;
while (end < n) {
char tmp = s[end];
if (mymap[tmp]) {
start = mymap[tmp];
mymap[tmp] = end + 1;
length = end - start + 1;
}
else {
mymap[tmp] = end + 1;
length++;
}
end++;
result = max(result, length);
}
return result;
}