[leetcode]3.无重复字符的最长子串

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

示例 1:

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

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

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

思路:
1.基本思路:采用滑动窗口的思想,即设置start,end分别从s的0号位置开始遍历,end每向后走一位,判断s[end]是否在start到end之间出现过,如果出现过,记录位置为s,保存当前的length=end-start,同时将start移动到s的后一位,继续遍历,直至end=s.size(),输出过程中最大的length。
2.优化,对于查找s[end]是否在start到end之间出现过,采用hashmap的方法,将字符与其对应的下标保存起来,对每一个s[end],判断是否在hashmap中出现过并且hashmap[end]>=start(当前判断的位置一定要在start之后,因为s[end]可能在start之前出现过,这种情况不能更新),如果满足条件,令start保存为hashmap[end]+1,更新length。最后输出过程中最大的length。

AC代码:(C++)

class Solution {
   public:
    int lengthOfLongestSubstring(string s) {
        int start = 0, end = 0, length = 0, max_Length = 0;
        int s_size = s.size();
        unordered_map<char, int> mp;
        while (end < s_size) {
            char temp = s[end];
            if (mp.find(temp) != mp.end() && mp[temp] >= start) {
                //在前面存在相同的字符,start跳到这个字符的后一个位置
                start = mp[temp] + 1;
                length = end - start;
            }
            mp[temp] = end;
            end++, length++;
            if (length > max_Length) max_Length = length;
        }
        return max_Length;
    }
};
发布了157 篇原创文章 · 获赞 1 · 访问量 6047

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/105723082