Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
方法1:采用简单的枚举方法。O(n^2)
<span style="font-size:18px;">#include<iostream>
#include<memory.h>
using namespace std;
int lengthOfLongestSubstring(string s)
{
int i,j,count,max;
bool visited[300];
int len=s.length();
max=0;
for(i=0;i<len;i++)
{
count=0;
memset(visited,false,sizeof(visited));
for(j=i;j<len;j++)
{
if(!visited[s[j]])
{
visited[s[j]]=true;
count++;
}else
break;
}
if(count>max)
max=count;
}
return max;
}
int main(int argc,char *argv[])
{
string s;
cin>>s;
cout<<lengthOfLongestSubstring(s)<<endl;
return 0;
}</span><span style="font-size: 14px;">
</span>
方法2:
从左往右扫描,当遇到重复字母时,以上一个重复字母的index +1,作为新的搜索起始位置。比如
直到扫描到最后一个字母。
<span style="font-size:18px;">int lengthOfLongestSubstring(string s)
{
int i,j,t,len,index;
int l=0;
int Lmax=1;
len=s.length();
index=0;
while(index<len)//the start point
{
i=index+1;
while(i<len)//the end point
{
for(j=index;j<i;j++)//from index to i
{
if(s[i]==s[j])//从index到i-1存在和i相同的
{
l=i-index;
if(l>Lmax)
Lmax=l;
index=j+1;//更新下一次起始位置
goto out;
}
}
i++;
}
l=i-index;//从index到i-1不存在和i相同的
if(l>Lmax)
Lmax=l;
out:
if(i>=len-1)//当i遍历到末尾了,也就求出了最大长度
break;
}
return Lmax;
}</span>
上面这种方法依旧超时,估计是出在对index到i的这段遍历上。明天有时间再补。。。。