[LeetCode] Longest substring without repeating characters 最长无重复子串
Posted 王大咩的图书馆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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)。
以上是关于[LeetCode] Longest substring without repeating characters 最长无重复子串的主要内容,如果未能解决你的问题,请参考以下文章
leetcode--5. Longest Palindromic Substring
#Leetcode# 5. Longest Palindromic Substring
[LeetCode] 5 Longest Palindromic Substring
Leetcode-Longest Substring Without Repeating Characters