[LeetCode]Longest Substring Without Repeating Characters

使用DP的思想
L[i]记录的是最长无重复字串,L[i]=s[m,..,i],终点到i,我们为s[]中每一个字符构建一个hashmap,关键字为char,值为在原字符串中的下标index

下面开始找s[i+1]
如果s[i+1]在hashmap中没有出现,将s[i+1]加入hasp表,并且L[i+1]=s[m,…,i+1],map[s[i+1]]=i+1;
如果s[i+1]出现了,并且s[i+1]在hashmap中的下标为k,那么m需要跟新
m=max[m,k],L[i+1]=s[m,…,i+1],同时hashmap也要同时跟新,即map[s[i+1]]=i+1;

所以要一直更新map

int lengthOfLongestSubstring(string s) {
    // for ASCII char sequence, use this as a hashmap
    vector<int> charIndex(256, -1);
    int longest = 0, m = 0;

    for (int i = 0; i < s.length(); i++) {
        m = max(charIndex[s[i]] + 1, m);    // automatically takes care of -1 case
        charIndex[s[i]] = i;
        longest = max(longest, i - m + 1);
    }

    return longest;
}

注意 这里m的值记录的是到i的最长自序列的起始下标

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值