题意:给你一个字符串,求一个连续的没有重复字符的最大子串。
思路:设置两个数组flag[256]和pos[256],flag记录某个字符是否包含在当前子串中,pos记录某个字符在当前子串中的位置。当出现重复字符ch时,就把当前字符串中ch前面 的字符全部去掉,并更改flag和pos。
算法流程:b a c a b c b b
↑ (i=3,len=3,flag['b','a','c']=true,pos['b','a','c']=[0,1,2],当前子串bac)
此时字符a重复出现,子串bac→c,并加入a,所以当前子串变为为ca,len=2,flag['c','a']=true,pos['c','a']=[2,3]
……
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maxlen=0,len=0;
bool flag[256];//标记每个字母是否出现
int pos[256];//记录位置
for(int i=0;i<256;i++)
flag[i]=false;
for(int i=0;s[i];i++)
{
if(!flag[s[i]])
{
flag[s[i]]=true;
len++;
}
else
{
for(int j=i-len;j<pos[s[i]];j++)
flag[s[j]]=false;
len-=(pos[s[i]]-(i-len));
}
if(len>maxlen)
maxlen=len;
pos[s[i]]=i;
}
return maxlen;
}
};