Leetcode3无重复字符的最长子串
动态规划
dp[i]=dp[i-1]+1;i字符未出现过或是前一个相同字符的距离超过了以前一个字符为结尾的字符串的长度
dp[i]=i-a[t];与其哪一个相同字符的距离较近
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 200
int lengthOfLongestSubstring(char * s){
int t,index=0,max=0,i,len,a[128]={0},*dp;
len=strlen(s);
dp=(int *)malloc(sizeof(int)*len);
for(i=0;i<len;i++){
dp[i]=0;
}
for(i=0;i<128;i++){
a[i]=-1;
}
if(len==0){
return 0;
}
dp[0]=1;
max=1;
t=s[0];a[t]=0;
for(i=1;i<len;i++){
t=s[i];
if(a[t]==-1){//碰到相同字符或与前一个相同字符的距离超过了以前一个字符为结尾的字符串的长度
dp[i]=dp[i-1]+1;
}else if(i-a[t]>dp[i-1]){
dp[i]=dp[i-1]+1;
}else{
dp[i]=i-a[t];
}
max=max>dp[i]?max:dp[i];
a[t]=i;
}
return max;
}
int main(){
char str[maxn]=" ";
printf("%d\n",lengthOfLongestSubstring(str));
}