思路:初始时,i指向第一个字符,j指向第一个不等于i的字符,k从j+1开始找第一个不等于i和j对应字符的位置,另外设有变量rightMosti和rightMostj分别表示i和j对应字符在最右边出现的位置,i的下一个位置即为min(rightMosti,rightMostj)+1,j=k,k从下个位置开始找。时间复杂度为:O(n)。
#include<iostream>
using namespace std;
int hash[26];
int getSubString(char* ch){
int len=strlen(ch);
if(len<=1)
return -1;
int i=0,j,k,res=0,rightMosti=0,rightMostj;
for(j=i+1;j<len;j++){
if(ch[j]!=ch[i])
break;
rightMosti=j;
}
if(j==len)
return -1;//没有找到
else
{
while(i<len-1){
hash[ch[i]-'a']=1;
hash[ch[j]-'a']=1;
rightMostj=j;
for(k=j+1;k<len;k++)
{
if(hash[ch[k]-'a']==0)
break;
if(ch[k]==ch[i])
rightMosti=k;
if(ch[k]==ch[j])
rightMostj=k;
}
if(k==len){
if(len-i>res)
res=len-i;
break;
}
else{
if(k-i>res)
res=k-i;
hash[ch[i]-'a']=0;
hash[ch[j]-'a']=0;
i=min(rightMosti,rightMostj)+1;
j=k;
}
}
}
return res;
}
int main(){
memset(hash,0,sizeof(hash));
char* tmp="aaaaaaadgfasdfa";
cout<<getSubString(tmp)<<endl;
system("pause");
return 0;
}