给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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;
}
};