LeetCode:3 Longest Substring Without Repeating Characters

3 Longest Substring Without Repeating Characters

一开始没有理解题目,卡了好久。题目大意就是要找一个字符的最长子串,这个子串自身不能包含任何重复字符。
例子:”abcabcbb” is “abc”, “bbbbb” is “b”

如果考虑最简单的两重循环的话肯定超时= =。使用哈希表存储每个字符出现的位置m[i],开始指针startP指向0,然后用for(i)遍历字符串,子串长度就等于i - startP + 1,如果发现出现了重复字符,那么开始指针startP就等于存储位置的下一个:m[i] + 1,继续遍历检查是否大于当前最大子串长度,直至结束。

提交之后WA了两次,有两个细节没注意到:第一个是每次遍历到当前字符的时候,先检查哈希表有木有再插入,我当时是先插入了再检查的有木有(真傻了这还检查个毛= =)。第二个是如果字符重复,重复字符在当前遍历位置之前,那么startP不变,不用等于m[i] + 1(例子“abba”)。

最后AC代码如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map <char, int> m;
        int startP = 0;
        int max = 0;

        for (int i = 0; i < s.size(); i++)
        {
            if (m.count(s[i]))
            {
                if (m[s[i]] + 1 > startP)
                {
                    startP = m[s[i]] + 1;
                }
                m[s[i]] = i;
            }
            else
            {
                m.insert(pair<char,int>(s[i], i));
            }

            if (i - startP + 1 > max)
            {
                max = i - startP + 1;
            }
        }
        return max;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值