无重复字符的最长子串
    题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
    图片.png

    思路:遍历字符串,维护一个map记录每个字母上一次出现的index,并用一个变量dp记录当前指针所在的不重复子串的长度。遍历过程中的情况分为以下几种:

    • 该字符第一次出现,此时该字符必然不会与之前重复,故dp++
    • 该字符不是第一次出现
      • 若此时dp小于当前位置与该字符第一次出现的位置的差值,意味着之前出现的那次不会影响到目前dp的判断(不在判定范围里),故dp++
      • 否则,dp等于该差值(把重复的字符及之前的部分从dp中去除)

    结果返回dp的最大值。

    参考代码:

    1. class Solution {
    2. public:
    3. int lengthOfLongestSubstring(string s) {
    4. if (s.size() == 0) {
    5. return 0;
    6. }
    7. unordered_map<char, int> indexMap;
    8. int res = 0;
    9. int dpTable = 0;
    10. for (int i = 0; i < s.size(); ++i) {
    11. if (indexMap.find(s[i]) == indexMap.end()) {
    12. indexMap[s[i]] = i;
    13. dpTable++;
    14. res = max(res, dpTable);
    15. continue;
    16. }
    17. if (dpTable < i - indexMap[s[i]]) {
    18. dpTable++;
    19. res = max(res, dpTable);
    20. indexMap[s[i]] = i;
    21. }
    22. else {
    23. dpTable = i - indexMap[s[i]];
    24. res = max(res, dpTable);
    25. indexMap[s[i]] = i;
    26. }
    27. }
    28. return res;
    29. }
    30. };