给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。objective-c
示例1:数组
输入: "abcabcbb" 输出: 3 解释: 由于无重复字符的最长子串是 "abc",因此其长度为 3。工具
示例2:学习
输入: "bbbbb" 输出: 1 解释: 由于无重复字符的最长子串是 "b",因此其长度为 1。测试
示例3:优化
输入: "pwwkew" 输出: 3 解释: 由于无重复字符的最长子串是 "wke",因此其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。spa
滑动窗口是解决字符串和数组类问题的一个重要工具。就本地而言,咱们使用以下解题思路:code
class Solution {
public:
int lengthOfLongestSubstring(string str) {
int i = 0;
int j = 0;
int m = 0;
int size = (int)str.size();
map<char, int> tmap;
while (i<size && j<size) {
if (tmap.find(str[j]) == tmap.end()) {
tmap.insert(pair<char, int>(str[j], j));
j++;
m = max(m, j-i);
} else {
tmap.erase(tmap.find(str[i]));
i++;
}
}
return m;
}
};
复制代码
优化代码cdn
这里的优化思路是:当i须要向右滑动的时候不须要一次一次的滑动,而是直接跳到新的重复元素。字符串
举例来讲,对于测试用例:pwwkew来说。
当j=2,i=0是,map中已经有了pw了,对于j=2的w在map中已经存在w,因此此时须要将i右滑两次,只是咱们能够直接将i跳到2,而不用一步一步的滑动。具体代码以下:
int lengthOfLongestSubstring(string str) {
int i = 0;
int j = 0;
int m = 0;
int size = (int)str.size();
map<char, int> tmap;
while (j<size) {
if (tmap.find(str[j]) != tmap.end()) {
i = max(tmap.find(str[j])->second, i);
}
m = max(m, j-i+1);
tmap[str[j]] = j+1;
j++;
}
return m;
}
复制代码