LeetCode 第三题 Longest Substring Without Repeating Characters

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;
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值