Longest Substring Without Repeating Characters 无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列  而不是子串。

思路:先看一个例子,加入给定字符串为"abcabcbb",那么应该怎么计算呢?先放入a,b,c发现都没有重复的,这时最长长度为3,然后放入a,这时发现有重复的,应该删去首字符a,剩下字符为bca,长度为3,然后依次类推,遇到的字符如果在已有的字符串中出现就删除字符串中的字符已左的左右字符(包括自身),然后计算剩余字符串长度。其实读到这里我们大致可以有思路:用map存储<字符,字符在字符串中的下标>并初始化map全部为-1因为没有字符从-1开始,然后遍历一遍数组,按照上面的思想完成代码,但是这道题有个优化的算法,因为用ascll存字符最多只有256个,所以我们可以直接申请一个256长度的vector,下标表示字符串中字符对应的ascll码,值表示字符在字符串的下标。那么先写出如下代码:

for (int i = 0; i < s.size(); i++) {
	dict[s[i]] = i;
}
但是这样没有变量接收长度也没有长度计算的过程,所以我们需要一个计算长度的代码即:
maxLen = max(maxLen, i - start);

因为根据上面的分析我们只遍历一次代码,所以每次只计算到当前位置i的最大长度,那么start是如何被更新的呢,假设字符串中所有字符都不重复,那么当start初始化为-1时,如下代码便可以通过样例:

    int lengthOfLongestSubstring(string s) {
	vector<int> dict(256, -1);
	int start = -1;
	int maxLen = 0;
	for (int i = 0; i < s.size(); i++) {
		dict[s[i]] = i;
		maxLen = max(maxLen, i - start);
	}
	return maxLen;
    }

但是start需要更新,更新的位置便是在进入循环时判断dict[s[i]]是否为-1(-1表示还没有访问过该字符),如果是那么不更新,如果不是那我们就需要先更新start为旧的dict[s[i]]的位置,然后在判断,如下代码所示:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
	vector<int> dict(256, -1);
	int start = -1;
	int maxLen = 0;
	for (int i = 0; i < s.size(); i++) {
		if (dict[s[i]] != -1) {
			start = dict[s[i]];
		}
		dict[s[i]] = i;
		maxLen = max(maxLen, i - start);
	}
	return maxLen;
    }
};
哈哈哈,大功告成啦!!!哼,too simple。。。这样是通过不了样例的,因为我们是用vector模拟map来存储,并没有删除的步骤,比如遇到这个样例:abba 在访问最后的a时,start被赋值成了旧的a的位置(0),导致最后得出旧的长度即3,正确答案应该是2,所以我们应该加一个判断,如果当前dict[s[i]]的值大于start才更新start。
最终代码:
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
	vector<int> dict(256, -1);
	int start = -1;
	int maxLen = 0;
	for (int i = 0; i < s.size(); i++) {
		if (dict[s[i]] != -1) {
			start = max(start,dict[s[i]]);
		}
		dict[s[i]] = i;
		maxLen = max(maxLen, i - start);
	}
	return maxLen;
    }
};



扫描二维码关注公众号,回复: 2735425 查看本文章


猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/80986112