无重复字符的最长子串
题目链接: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;}};
