无重复字符的最长子串
题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
思路:遍历字符串,维护一个map记录每个字母上一次出现的index,并用一个变量dp记录当前指针所在的不重复子串的长度。遍历过程中的情况分为以下几种:
- 该字符第一次出现,此时该字符必然不会与之前重复,故dp++
- 该字符不是第一次出现
- 若此时dp小于当前位置与该字符第一次出现的位置的差值,意味着之前出现的那次不会影响到目前dp的判断(不在判定范围里),故dp++
- 否则,dp等于该差值(把重复的字符及之前的部分从dp中去除)
结果返回dp的最大值。
参考代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.size() == 0) {
return 0;
}
unordered_map<char, int> indexMap;
int res = 0;
int dpTable = 0;
for (int i = 0; i < s.size(); ++i) {
if (indexMap.find(s[i]) == indexMap.end()) {
indexMap[s[i]] = i;
dpTable++;
res = max(res, dpTable);
continue;
}
if (dpTable < i - indexMap[s[i]]) {
dpTable++;
res = max(res, dpTable);
indexMap[s[i]] = i;
}
else {
dpTable = i - indexMap[s[i]];
res = max(res, dpTable);
indexMap[s[i]] = i;
}
}
return res;
}
};