Leetcode 3. Longest Substring Without Repeating Characters



题意:求字符串中的最长非重复子串


思路 :用O(n)即可

要求知道每次字符的上一次出现的位置

例如

0  1  2  3  4  5

a  a  b  c  b  c

首先将每个字符的上次位置初始化为-1,左边界left设为0,当前子串长度now_sum为0

遍历过程:

i=0:  a的上次位置为-1,小于边界0,故now_sum加1。同时a的上次位置变成0

i=1:  a的上次位置为0,大于等于边界0,所以再利用原边界将出现重复。故先计算now_sum与ans的大小,接着再重置now_sum为当前位置减上次位置。最后再把左边界设为上次位置+1,即为1

i=2 : now_sum++

i=3: now_sum++

i=4:发现b的上次位置为2,大于边界1,故ans变成3,同时左边界变成3.

……同理



class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int last_char[250],left,ans,i,n,c,now_sum;
        for(i=0;i<250;i++)
            last_char[i]=-1;
        left=0;
        ans=0;
        now_sum=0;
        n=s.length();
        for(i=0;i<n;i++)
        {
            c=s[i];//字符ASCII码
            if(last_char[c]>=left)  //若上一个同字符位置大于等于左边界,则修改边界
            {
                if(now_sum>ans)
                    ans=now_sum;
                now_sum=i-last_char[c];   //新的now_sum值为当前位置减去上一个字符位置
                left=last_char[c]+1;   //边界为上一个字符位置+1
            }
            else
            {
                now_sum++;
            }
            
            last_char[c]=i;   //此字符的上一个位置
        }
        if(now_sum>ans)
            ans=now_sum;
        return ans;
    }
};


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值