【LeetCode】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.

一开始题目理解错误,或者是受前面输出子集的影响,直接取了不重复的字母数……

最开始试了下暴力枚举,O(n*n)复杂度,不出意外TLE。

然后考虑用map<char, int>来储存之前出现过的字符位置,每当出现重复字符时,将指针移回该字符上次出现的位置,map清空重新遍历,在过大数据的时候还是TLE,不过显然走的比之前远一点。

再然后考虑怎么将其优化到O(n)。再使用一个index变量来储存重复字符上次出现的位置,判定字符重复时加一个条件,即该字符上次出现的位置在index后面,这样就避免了将指针回移进行重复遍历。

代码如下:

class Solution {
public:
	int lengthOfLongestSubstring(string s) {
		int count(0), index(0), res(0);
		unordered_map<char, int> dup;
		for (int i = 0; i < s.length(); i++){
			if (dup.count(s[i])&&dup[s[i]]>=index){
				index = dup[s[i]];
				count = i - index - 1;
			}
			dup[s[i]] = i;
			count++;
			res = std::max(res, count);
		}
		return res;
	}
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值