&LeetCode0003& 无重复字符的最长子串

题目

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

示例 1:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:

输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

来源:力扣(LeetCode

思路

首先,可以建立一个 HashMap,记录每个字符和其最后出现位置之间的映射;
然后,定义两个变量 res 和 left,其中 res 用来记录最长无重复子串的长度,left 指向该无重复子串左边的起始位置的前一个,由于是前一个,所以初始化就是 -1;
其次,遍历整个字符串,对于每一个遍历到的字符,如果该字符已经在 HashMap 中存在,且映射值靠后于 left 的话,那么更新 left 为当前映射值位置;
再次,将映射值更新为当前座标i,这样保证了 left 始终为当前边界的前一个位置,然后计算窗口长度的时候,直接用 i-left 即可,用来更新结果 res值。

C++代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) 
    {
        int res = 0, left = -1, n = s.size();
        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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章