此题让我体会到我的智商真不怎么样。。
给一个字符串,求一个子串,不包含任何重复的字母
比如abca就有重复的字母a
第一想法是动态规划,但是没有想出来怎么定义状态
看了别人的思路
设置两个索引,head和tail,表示当前所枚举到的集合s[head...tail]
依次增加tail,每增加一个字符,若当前集合中存在,则增加head直到当前集合没有这个字符
这样就可以O(n)复杂度枚举所有可能的情况
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
if(s.size() == 0) return 0;
int head=0;
int tail=0;
int opt=0;//32位整数表示zyx...dcba各个字符是否在当前集合内
opt+=(1<<(s[0]-'a'));
int ans=1;
int cur=1;
while(true)
{
tail++;
if(tail>s.size()-1) break;
while((1<<(s[tail]-'a'))&opt)
{
opt-=(1<<(s[head]-'a'));
cur--;
head++;
}
opt+=(1<<(s[tail]-'a'));
cur++;
ans=max(ans,cur);
}
return ans;
}
};