滑动窗口查找最长子字符串

滑动窗口查找最长子字符串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3 
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
 请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
这道题来自力扣,中等难度。
可以用滑动窗口的方法来解决这个问题。窗口长度设为res。这里为了判断字符是否重复出现,可以用Hashmap,也就是创建一个unordered_map,这个map是为了把每一个字符对应到一个键值,注意map里的值是唯一的。
这题的关键是如何判断每次循环到的当前的字符是否出现过,如果当前的字符出现过并且当前字符s[i]的map[s[i]]比left大,滑动窗口中left代表的左边的位置下标就改变为map[s[i]]。每次循环都要把当前字符在map里对应的键值更新一下,res取res和i-left的较大值。
static int x = [](){ios::sync_with_stdio(false); cin.tie(nullptr); return 0; }();
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
            int res = 0, left = -1;//方法一
        unordered_map<int, int> map;
        for (int i = 0;i < s.size(); ++i) {
            if (map.count(s[i]) && map[s[i]] > left) {
                left = map[s[i]];
            }
            map[s[i]] = i;
            res = max(res, i - left);
        }
        return res;
    }
};

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注