审题
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
之前在数组部分做了几道双指针,在这道题上其思想一样适用,如果有读者之前没有了解过双指针的话,可以参考这篇博客 >>>戳这里。不看其实也没事。核心思想就是利用两个指针代替两层循环,从而降低一个幂次的复杂度,也有说法管这个叫移动窗口。
代码实现
了解了双指针后,我们写伪码如下:
当尾指针没到边界:
检查map里有尾指针指向元素的值是否为零:
是:尾指针元素入map,尾指针++,cnt++,更新max
否:头指针加加,头元素- -,cnt- -
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maximum=0, front=0, rear=0, cnt=0;
map<char,int> m;
while ( rear != s.size() ) {
if ( m[s[rear]] == 0 ) {
m[s[rear]]++; rear++; cnt++;
if ( cnt>maximum ) maximum = cnt;
} else {
m[s[front]]--; front++; cnt--;
}
}
return maximum;
}
};
反思
较基础的双指针应用,应熟练掌握。