首页 > 代码库 > leetcode -day21 Longest Substring Without Repeating Characters

leetcode -day21 Longest Substring Without Repeating Characters



1、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.

分析:看到此题想到设置一个next数组,将出现的每个字母的下一个标出,这样最大不重复的长度为某一段中next值的最小值,但是不好操作;然后想到用哈希表存储元素是否出现过,但是还需要知道出现的位置才能实现长度计算,设置一个left标记不重复串的起点,往后遍历,更新哈希表,当遇到已经出现在哈希表中的值时,此段的不重复长度为当前位置-left,更新最大长度,设置left为从上一次出现的位置后面开始,同时清空哈希表中前一段的值继续上述操作。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    	int len = s.size();
		if(len <= 1)	return len;
		vector<bool> chars(256, false);//用于判断字母是否出现过
		vector<int> position(256, 0); //保存字母出现的位置
		int left = 0; //左侧点
		int cur = 0; //从头开始
		int ret = 0; //最大长度
		while(cur < len)
		{
			char ch = s.at(cur); 
			if(!chars[ch]) //如果没有出现过
			{
				chars[ch] = true; 
				position[ch] = cur; 
			}
			else  //如果出现过,则更新最大长度,下次从上一同字母的位置开始计算长度
			{
				ret = max(ret, cur - left); //更新最大长度
				for(int i = left; i < position[ch]; ++i)  
					chars[s.at(i)] = false;
				left = position[ch] + 1;//从上次出现的位置开始
				position[ch] = cur; 
			}
			++cur;
		}
		return max(ret, cur - left);
    }
};