3.无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1: |
---|
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 |
示例 2: |
---|
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 |
示例3: |
---|
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 |
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
主要思路:滑动窗口
维护一个滑动窗口,窗口内的都是没有重复的字符,去尽可能的扩大窗口的大小,窗口不停的向右滑动。
- (1)如果当前遍历到的字符从未出现过,那么直接扩大右边界;
- (2)如果当前遍历到的字符出现过,则缩小窗口(左边索引向右移动),然后继续观察当前遍历到的字符;
- (3)重复(1)(2),直到左边索引无法再移动;
- (4)维护一个结果 res,每次用出现过的窗口大小来更新结果 res,最后返回 res 获取结果。
时间复杂度:O(n)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res_max = 0;
int i,j,k=0;
if(s == " ") res_max = 1;
for(int i = 0; i<s.size() ; i++){
for(int j = k; j<i; j++){
if(s[j] == s[i]){
k = j+1;
break;
}
}
if(i-k+1 > res_max) res_max = i-k+1 ;
}
return res_max;
}
};
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.