03:无重复字符的最长子串
分析:
①子串和子序列不同,子串必须是连续的一段字符串,而子序列可以不连续;
②vector定义一维数组:
③思路:
维护一个滑动窗口,保证窗口内不含有重复字符,对字符串进行遍历,每遍历一个字符就把他加入到窗口内,同时更新窗口的左边界,保证窗口内没有重复元素;则遍历结束之后,就能得到最长的窗口长度;
重点:
一、如何更新窗口的左边界:
窗口左边界的维护依赖于新加入字符上一次出现的位置,如果上一次出现的位置在窗口外,则左边界不需要变化;如果上一次出现的位置在窗口内,则左边界更新为当前字符上一次出现位置的下一个位置。
因此,便利的同时需要一个数组来记录每一个字符上一次出现的位置。
二、数组大小:
题目说字符串是由字母、数字、符号和空格组成,可以开一个长度为128的数组来存储。
理由:
当数组的下标是字符时会带入ASSII码值进行运算,数组长度128即代表128的字符的所有可能,如果是用字典来理解的话就是,键是字符,而值是这个字符上一次出现的位置。
三、pos[s[i] ]代表的是当前字符上一次出现的位置,初始值为一开始赋值的-1,后由第九行代码赋值,下一次循环生效;
四、窗口大小 = 右边界 — 左边界 + 1
解答:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> pos(128,-1);
int ans=0;
for(int i = 0,j = 0; i < s.length() ; i++){
j = max(j, pos[s[i]]+1);
ans = max(ans,i - j + 1);
pos[s[i]] = i;
}
return ans;
}
};
视频讲解:哔哩哔哩——睡不醒的鲤鱼——Leecode 每日一题第三题。