Leetcode—最大无重复子串

来源:互联网 发布:加德士电商加盟淘宝 编辑:程序博客网 时间:2024/05/07 17:19

题目如下:

求一个字符串的最长无重复子串

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

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", 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.

代码如下:

class Solution {public:    int lengthOfLongestSubstring(string s) { int ret = 0;map<char, int> m;for (int i = 0; i < 26; i++)m[97 + i] = -1;//每个字符上次出现的位置是-1int start = 0;//无重复字符开始的位置for (int i = 0; i < s.length(); i++){ char c = s[i];if (m[c] >= start){start = m[c]+1;m[c] = i;//最近一次出现的位置}else{ m[c] = i;//最近一次出现的位置ret = max(ret, i - start+1);}}return ret;    }};

算法思想:

找出字符串中任意两个相同字符串,然后计算它们之间字符的个数,若任意两个相同字符之间间隔的不相同字符越多,则代表它们之间的无重复字符串越多!

在如上的代码中,有两个非常重要的变量

1. start:记录无重复字符串的起始位置

2. map容器记录每个元素上次出现的位置,如果上次出现的位置在start之后,说明从start到当前位置,该元素是第二次出现,如果是这样,那就将当前start的值设置为当前重复元素的上一次出现的位置的值。

3. 每一次for循环都将设置当前位置上元素出现的位置。

。程序从一开设置最长无重复字符串的长度为零,且无重复字符串的下标从0开始,

其中,m[c]>=start代表上次出现的位置如果在无重复字符开始位置的右边(包括=号是因为会出现aaaaa的情况)

4. 这个算法题的关键点在与选取无重复字符的起始点,假设我们有如下字符串

IAMSTAJKMTHL

我们的惯性思维是将IAMSTAJKMTHL划分为最小的无重复的子串,也就是说我们会从第一个字符开始往前找一旦找到和前面字符一样的话,就将该字符的下一个字符设为无重复字符串的起始点,但这样的做法是不正确的

在上述的例子中

                             I   A  M   S  T  A   J  K

                             0  1   2   3  4   5  6  7  

我们检测到了第5个字符有重复,那么从04之间的字符就没有重复,那么下一个无重复字符串的起始点就不可能在[0,1]之间,只能从2开始,因为A和下标为2的前一个元素相同,和[2,4]之间的元素可定不同,所以2可以看作是新不重复子串的起始点。

做如下修改之后就可以求出最长无重复子串的起止位置

class Solution {public:int lengthOfLongestSubstring(string s) {int ret = 0,temp=0;int begin = -1, end = -1;map<char, int> m;for (int i = 0; i < 26; i++)m[97 + i] = -1;int start = 0;//无重复字符开始的位置for (int i = 0; i < s.length(); i++){ char c = s[i];if (m[c] >= start){//若重复出现则大于或等于1start = m[c]+1;m[c] = i;//最近一次出现的位置}else{ m[c] = i;//最近一次出现的位置temp = max(ret, i - start+1);if (temp>ret){ //在这里适当修改可以求出所有满足条件的字符串begin =start;end = i;}}}return ret;}};
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">个人觉得这个算法一定要熟练掌握,因为在很多字符串算法延伸题中会用到这个子功能,然后再这个子功能上进行下一步拓展等等.........</span>

0 0
原创粉丝点击