Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"
Output: 3 
Explanation: The answer is "abc", with the length of 3. 

Example 2:

Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.

Example 3:

Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3. 
             Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

这道题很容易想到用一个空间放入子串substring,然后str的下一个字符如果出现在substring里面,那么就把出现这个字符之前的子串丢掉,把剩余的子串留下,例如qweabcaefage 此串匹配到qweabc   下一个字符为a,这时候应该将子串中的qwea丢弃,将bca留下,然后不断判断最大值。

对于这种数组,字符串,链表查找的题,最重要的有两点:

1、HashMap的使用,将key作为数组值,将value作为index,这样原数组可以根据index找到对应的数组值,Map可以根据对应的值找到index,大大提升查找效率。尤其是统计字符个数的时候,HashMap是最佳选择。例如判断两个字符串是否为同字符不同顺序的字符串,abcd与cbad 统计个数来判断

2、利用双向指针,左右各一个,中间的为滑动窗口,即为所求元素,这样考虑边界问题的时候非常方便,若求子序列长度则为len = high - low + 1

管用套路即为:

if (hashmap.find(s.at(high)) != hashmap.end())
{	
	//哈希表中找到了,则进行相应处理
    //...
}
else
{
    //如果没找到,则建立哈希表  key=a[high]  value=high 即为index
    hashmap.insert(pair(s.at(high), high));
	
} 
if (length < high - low + 1)
	length = high - low + 1;    //统计长度

AC代码如下

class Solution {
public:
	int lengthOfLongestSubstring(string s)
	{
		//利用count记录子串大小虽然直观,但是当查找左右index时候比较费劲
		//还是推荐遇到了数组或者字符串或者链表等查找问题,首先考虑HashMap
		//第二个考虑双指针指向左右窗口,这样count = i-j+1
		//此时考虑左右边界的时候非常方便
		int max = 0;
		if (s.length() < 1) return 0;
		if (s.length() < 2)	return 1;
		map hashmap;
		for (int low = 0, high = 0; low < s.length() && high < s.length(); high++)
		{	//low 和high代表子串的左右边界
			if (hashmap.find(s.at(high)) != hashmap.end())
			{	//如果在map中找到了最右边的字符串
				//此时修改左边边界low  使其指向那个不重复的子串
				//1、如果查找到的字符在字符串内部,所以要把内部字符的index+1赋给low
				if (low <= hashmap[s.at(high)])
				{
					low = hashmap[s.at(high)] + 1;
					hashmap[s.at(high)] = high;	//更新查找到的内部index
				}
				else
				{	//如果查找到的字符在子串外部,则low不需要改变,
					//因为外部的字符不会影响连续的内部子串,
					//但是要更新此时该字符的index
					hashmap[s.at(high)] = high;
				}
			}
			else
                                //如果没找到,则建立哈希表
				hashmap.insert(pair(s.at(high), high));	
			if (max < high - low + 1)
				max = high - low + 1;
		}
		return max;
	}
};

 

你可能感兴趣的:(LeetCode,C++,LeetCode)