Given a string, find the length of the longest substring without repeating characters
找到最长非重复子序列。
思路:采用动态规划法,字符串中每一个元素的对应的最长子串是变化的,后一个元素的子串长度,可以基于前一个元素进行计算。
定义一个L[100000],记录各个元素的最长子串的长度,L[i]有两种情况,①i=0,L[i]=1;②1<=i<=strlen(s) 的时候,需要基于L[i-1]的值来判断,如果在s[i-L[i-1]...i-1]之间出现了与当前元素s[i]相同的元素,则记录相同元素最后一次出现的位置,假设为index,则L[i]=i-index;如果在s[i-L[i-1]...i-1]没有出现与s[i]相同的元素,则L[i]=L[i-1]+1;
算法实现:
int lengthOfLongestSubstring(char* s) {
int i,j,index;
int length=strlen(s);
int L[100000];
if(length==0) return 0;
L[0]=1;
for(i=1;i<length;i++){
int flag=0;
for(j=i-1;j>=i-L[i-1];j--){
if(s[i]==s[j]){ //
flag=1;
index=j;
}
}
if(flag==0){
L[i]=L[i-1]+1;
}
else{
L[i]=i-index; //³öÏÖÁËÖظ´£¬×î´óµÝÔöΪ1
}
}
int max=L[0];
for(i=0;i<length;i++)
if(max<L[i]) max=L[i];
return max;
}