3.longest substring

#3 longest substring


问题分析: 这道题第一想法也是想着用嵌套for循环来穷举,但是有了前面的经验,我认为一定会time limit,所以琢磨了一下,采用“哈希”的做法,根据ASCII码将字符哈希到数组,数组值为字符在string中的下标。解决问题的关键在于当出现重复字符时,提前记录下前面的substring的长度ans,将prePos移到到由重复字符开始的新的substring的下标值,继续curPos游动找到新的substring的最大长度与已有的ans比较,如果小于ans则保留and的值,继续找。那么如何使得当重读出现时移动prePos到下一个substring第一个字符的下标值呢



代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int index[128] = {0};
       // memset(index, 0, 128);
        int ans = 0;
        int len = s.length();
        int prePos = 0, curPos = 0;
        while(curPos < len) {
            prePos = max(index[s[curPos]], prePos);//[2]
            ans = max(ans, curPos-prePos+1);
            index[s[curPos]] = curPos + 1; // [1]
            curPos++;
        }
        return ans;  
    }

    int max(int a, int b) {
        if(a < b) return b;
        else return a;
    }
};

直观上[1]出应该是index[s[curPos]] = curPos;,但是index[s[curPos]] 已经不影响ans,并且为了计算当重复出现prePos的值,与[2]结合,则当出现重复时,prePos就移到那里去了,注意到一开始index的值都是0,也就是prePos保持为0如果没有重复出现的话

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值