题目:给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
思路:
总共只用一个vector,如果发现重复的字符,把当前vector的大小记录下来,然后删除重复字符之前的所有字符
例如tabcadebb
v里面一个一个存,直到第二个a的出现, 这时,存下来当前v的长度,也就是v = tabc = 4
这时候删掉a和a之前的所有字符 v = bc 然后把现在这个a记录到后面 v = bca
这样的话只需要重复一遍,而且代码十分容易理解
class Solution {
public:
int lengthOfLongestSubstring(string s) {
auto it1 = s.begin();
vector<char> v; //储存字符串的vector
int max = 0; //最后输出的最长的字符串的个数
int lin = 0; //字符串的个数(不一定是最长的)
while (it1 != s.end()) {
auto it3 = find(v.begin(), v.end(),*it1); //查询v里面有没有当前要插入的字符
if (it3 == v.end()) { //如果没有找到
v.push_back(*it1); //就把这个字符放在v的最后面
lin++; //并且让这个字符串的大小加一
}
else { //如果当前vector里面已经有这个字符了
if (max < lin) max = lin; //那么把lin存一下,如果之前已经有比lin长的字符串了,那么就不存
v.erase(v.begin(), it3+1); //把包括当前重复的字符和它以前的所有字符都删掉
v.push_back(*it1); //然后将刚刚的字符插在v的最后面
lin = v.size(); //lin等于新的vector的大小
}
it1++; //指针指向下一个字符
}
if (max < lin) max = lin; //确保max里面是最长的字符串的长度
return max;
}
};
参考博客:
https://blog.csdn.net/weixin_42624114/article/details/81631682
对以上加速代码的解释:
https://blog.csdn.net/qq_32320399/article/details/81518476