leetcode 最长不重复子串:
利用hash表解决:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int begin(0), end(0);
int sSize = int(s.size());
int len=0;
int maxLen = 0;
unordered_map<char,int> hash;
while(end<sSize)
{
char tempChar = s[end];
if(hash.find(tempChar)!=hash.end()&&hash[tempChar]>=begin)
{
begin = hash[tempChar]+1;
len = end-begin;
}
hash[tempChar]=end;
end++;
len++;
maxLen = max(len,maxLen);
}
return maxLen;
}
};
第一次没搞懂就在于没看懂这个if判定;
下面来梳理一下逻辑:
每次都设tempChar为字符串下一个待判定的字符:
如果字符串所有字符都是不一样的,那么我们会得到:
hash[tempChar]=end; 即hash表中每一个字符key都按照其位置得到了一个value(0,1,2,3…
最长子串长maxLen就是字符串长
但是因为有重复,所以要判定:这个if判定有两个作用:
-
hash.find(tempChar)!=hash.end()
确定当前值在hash表内;如果不在的话,hash.find会返回hash.end
- hash[tempChar]>=begin
因为hash[tempChar]还没有更新,所以其所指向的是上一个相同值在字符串中的位置,需要让这个位置在begin的右侧。
如果这个值已经在begin的左侧,也就是没有被包进来,那么表示意思就是不在当前窗口内,不需要管它。只需要管好窗口内的值就好了。
如果两个条件都满足,那么进入判定内,更新begin位置,将begin右移一位,hash表中char的value就是该char字符在字符串中的位置。
因为:🐸
tempChar = s[end];
hash[tempChar]=end;