力扣3:无重复字符的最长子串

力扣3:无重复字符的最长子串

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

思路

这道题的思路其实是很简单的,最后我们需要得到子串的长度所以我们可以定义两个变量即子串的左边界和右边界这样有了左右边界就等于有了子串。然后我们从子串的起始位置开始移动右边界,每次移动前都要判断当前子串中是否有重复的字符如果有我们必须移动左边界直到移动到这个重复的字符后。

思路就是这样个思路,那么问题主要就是如何进行判断子串里是否有重复字符。其实也很简单我们使用哈希表即可。

代码

cpp 复制代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        if (n <= 1) {
            return n;
        }
        int res = 0;
        // 子串的左边界
        int left = 0;
        // 子串的有边界
        int right = 0;
        // 使用哈希表来检查是否有重复的字符
        unordered_set<char> us;
        for (right = 0; right < n; right++) {
            char ch = s[right];
            // 如果在哈希表里有了这个字符
            while (left <= right && us.count(ch)) {
                // 就从哈希表中删除左边界的字符
                // 并且++左边界直到哈希表中不存在ch字符
                us.erase(s[left]);
                left++;
            }
            us.insert(ch);
            res = max(res, right - left + 1);
        }
        return res;
    }
};