力扣3-最长无重复字符的字串longest Substring without repeating characters

白昼怎懂夜的黑 提交于 2020-02-25 01:08:19

题目

Given a string, find the length of the longest substring without repeating characters.
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

举例

abc 3
bbb 1
pwwkew 3

解题思路

1利用hashmap来降低时间复杂度,建立字符与位置之间的关系
2用滑动窗口维护一个不重复字符串
3通过滑动窗口得到最长子串的长度

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //维护一个滑动窗口,里面字符无重复
        int res=0, left = -1, n = s.size();
        //本题中字符与其位置非常重要,所以预先一个hashmap
        unordered_map <int,int> m;//定义
        for (int i = 0; i<n; ++i)
        {
            if(m.count(s[i]) && m[s[i]]>left)
            //第一个条件成立,就说明当前字符在之前就一定存在过了
            //第二个条件说明之前出现过的字符在窗口内
            {
                 left = m[s[i]];//移除前一个
            }
            m[s[i]] = i;//就是构建哈希的步骤
            res = max(res,i-left);
        }
return res;
    }
};

回看笔记/注意点

一. 哈希表是在遍历过程中同时建立起来的,对字符的位置更新随着遍历在更新
字符串:a b c b d
哈希表:a:0 b:1
a:0 b:1 c:2
第四次: 哈希表中存在b说明之前已经存在过了,并且在窗口内,就更新哈希表中b
a:0 b:3 c:2
并且窗口移到第二个b前面
二. 注意边界问题,left算不算在窗口内之类

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!