当前字母与前一个字母为结尾最长序列比较,复杂度O(n*n)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
if(n==0)
return 0;
int i,j;
int dp[n];
dp[0]=1;
int maxn=1;
for(i=1;i<n;i++)
{
dp[i]=1;
for(j=i-1;j>=i-dp[i-1];j--)
{
if(s[j]==s[i])
break;
dp[i]++;
}
maxn=maxn>dp[i]?maxn:dp[i];
}
return maxn;
}
};
方法2:
双指针指向子串开头和结尾,若子串有重复字母,则移动开头指针到重复字母的下一个字母
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
if(n==0)
return 0;
bool can[256];
memset(can,true,sizeof(can));
int maxn=1;
int i,j;
for(i=0,j=0;j<n;j++)
{
if(can[s[j]])
{
can[s[j]]=0;
}
else
{
while(s[i]!=s[j])
{
can[s[i]]=1;
i++;
}
i++;
}
maxn=maxn>j-i+1?maxn:j-i+1;
}
return maxn;
}
};