给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
解释: 因为无重复字符的最长子串是 “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;
}
};