Longest Substring Without Repeating Characters (LeetCode)

来源:互联网 发布:php网站架构 编辑:程序博客网 时间:2024/06/05 20:45

问题描述: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.

1.O(n)解法

本题可采用动态规划的方法。使用两个指针i,j,分别指向当前非重复子串的串头和串尾。未出现重复的字符时,i指向串头位置不变,j逐渐向原始字符串的尾部移动。当出现一个重复的字符时,说明(s[i],s[j-1])的子串可能是一个最大非重复子串,所以可能需要更新最大值。同时max记录的是所有以(s[0],s[i])开头的最大非重复子串的长度,所以需找下一个最大非重复子串的时候可以把首指针i移动到i+1位置。

因为i,j都只需要遍历字符串一次,所以最坏的情况是2n(当字符串只包含一个字符时),所以运行时间是O(n)。

源代码如下:LeetCode测试时间20ms

class Solution {public:int lengthOfLongestSubstring(string s) {int n = s.length();int i = 0, j = 0;//i:substring首;j:substring尾int maxLen = 0;bool exist[256] = { false };while (j < n){if (exist[s[j]]) //如果已经字符已经扫描过{maxLen = (maxLen> j - i) ? maxLen : (j - i);while (s[i] != s[j])//扫描与s[j]字符相同的字符位置,将首指针移到该位置的下一个字符{exist[s[i]] = false;i++;}i++;j++;}else{exist[s[j]] = true;j++;}}maxLen = (maxLen > j - i) ? maxLen : (j - i);//将最终扫描结果赋给maxLenreturn maxLen;}};

2.My own solution

自己的方法只用了一个指针,运行时间119ms,很low。
源码如下:
class Solution {public:    int lengthOfLongestSubstring(string s) {    int max = 0;int temp = 0;//记录当前非重复子串的长度int exclude = -1;//相当于上例的头指针map<char, int> mapA;//保存字符串以及最近一次出现的位置for (int i = 0; i<s.length(); i++){char c = s[i];if (mapA.find(c) == mapA.end())//first insert{mapA[s[i]] = i;temp++;}else//repeating charaters occur{if (mapA[c] <= exclude)//重复的字符在被排除的字符串里{mapA[c] = i;temp++;}else{temp = i - mapA[s[i]];exclude = mapA[s[i]];//保存exclude的标签值mapA[s[i]] = i;}}if (temp > max)max = temp;//保存本次子序列的最长非重复字符串长度}return max;    }};

最后分享一篇讲的很好的本题解法(英文)http://leetcode.com/2011/05/longest-substring-without-repeating-characters.html





0 0
原创粉丝点击