Leetcode NO.3 Longest Substring Without Repeating Characters

本题要求如下:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

这题看似简单,其实也不难,只不过我开始走到了一个陷阱里面,得出了错误的答案,

比如给出的例子: abcabcbb,我开始的算法是:

1,设一个hashmap,如果找不到s[i],则将其插入hashmap,然后检测下一个i

2,如果找到hashmap里面有s[i],则将hashmap清空,然后重新开始,但是此时要记录下hashmap的size()与count比较,如果大于count,这个作为count。

但是这个算法有一个漏洞:比如"abcdbaf",按我的算法就是检测完abcd,发现下一个元素b在还是hashmap中出现过,所以清空hashmap,从这个b继续开始检测,这样得到的count就是4,但其实这道题是5:"cdbaf"

所以正确算法,设定一个left,是如果检测到元素"b",应该把left到“b”之前的元素从hashmap中删除,但是别的元素保留,且将left移动到"c"的位置。

代码如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int right = 0;
        int left = 0;
        int count = 0;
        map<char, bool> character;
        map<char, bool>::iterator it;
        while (right < s.size()) {
        	it = character.find(s[right]);
        	count = max(count, right-left);
        	if (it != character.end()) {
        		while (s[left] != s[right]) {
        			character.erase(s[left]);
        			++left;
        		}
        		++left;
        		++right;
        	}
        	else {
        		character[s[right]] = true;
        		++right;
        	}
        }
        count = max(count, right-left);
        return count;
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值