无重复字符的最长子串
题解:
/**
* 解题思路:定义变量头部序号(0)和滑动窗口(0),定义一个unordered_set,定义下一个要加入滑动窗口的元素位置(0),
* 定义长度变量为字符串的长度。定义一个当前窗口大小(0),开始循环
* 将下一个要加入滑动窗口的元素在哈希表中查找,若未找到,则将其加入哈希表中,元素值为键值,
* 同时当前滑动窗口大小加1.用当前滑动窗口大小更新滑动窗口大小,下一个要插入的位置加1.
* 若找到,则将头部序号对应的值从哈希表中删除,头部序号加1,当前窗口大小减1,继续。
* 循环终止条件为下一个要加入窗口元素位置为字符串的长度。
*
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int head=0, win = 0, nextpos = 0, curwin = 0;
unordered_set<char> myset;
int len = s.length();
while(nextpos != len){
int sum = myset.count(s[nextpos]);
if(sum == 0){
myset.insert(s[nextpos]);
curwin++;
nextpos++;
if(curwin > win) win = curwin;
}
else if(sum == 1){
myset.erase(s[head]);
curwin--;
head++;
}
}
return win;
}
};
首先看题要仔细,总感觉今天看题有点恍惚,虽然最后没有在看题上出问题,其次是当你在纠结怎么提高查找的效率的时候,不用纠结,大部分都是直接放在哈希表中。
我觉得这个题最最最特殊的地方就是用了这种滑动窗口的思想,说实话如果不是在计网里面学过我是真不能根据一个滑动窗口的标签就写出算法来,我觉得这种连续的子序列都可以考虑一下滑动窗口的做法,因为滑动窗口确实很提高效率。
来,我觉得这种连续的子序列都可以考虑一下滑动窗口的做法,因为滑动窗口确实很提高效率。
上面这个解法并不是最优的,可以用unordered_map来存储,当检测到重复元素后head直接跳到相应的序号。