[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.
题意:给定字符串找到最大无重复子串。
思路:参考LeetCode中提交的答案。使用哈希表的思想,建立一个256位大小的整型数组来代替哈希表(原因不知,博友Grandyang给出的原因是是ASCII表共能表示256个字符,所以可以记录所有字符。)哈希表中,在没有遇到重复字符之前,将当前字符对应的值赋为其在给定串s中的下标;当遇到重复字符时,因,该重复字符对应的值(即该字符的下标)大于上一串没有重复字符的起点下标,所以更新新子串的起点(深刻理解这句话),并记下此时的maxLen值。我们以s="abcabcb"为例,分析整个过程。当遍历到第二个 "a"时,m[s[i]]=0>-1 ,所以,start=0,同理可以更新后面的字符对应的值,更新过程用图表示如下:
update 2019-1-8:图可能没有表示清楚,若是看图不好理解,请忽略,后续问题我会改进的。
代码如下:
1 class Solution { 2 public: 3 int lengthOfLongestSubstring(string s) 4 { 5 vector<int> m(256,-1); 6 int maxLen=0,start=-1; 7 for(int i=0;i<s.size();++i) 8 { 9 if(m[s[i]]>start) //有重复 10 start=m[s[i]]; 11 m[s[i]]=i; //更新 12 maxLen=max(maxLen,i-start); 13 } 14 return maxLen; 15 } 16 };
注意:两部分不重复子串存在交叉的情况。不能使用这样的思路:记录两字符中间的长度,然后以第二字符为开始遍历得到新的字符,因为若是有交叉的情况,如abcade,abc和bcade存在交叉,返回值应该是5(bcade),不是3(abc或者ade)。