leetcode Longest Substring Without Repeating Characters

来源:互联网 发布:新注册淘宝号怎么升级 编辑:程序博客网 时间:2024/05/07 07:14

题意:

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.

意思是让我们求一个字符串的最大连续不重复子串,也就是子串没有相同的元素。

最普通的方法是枚举每个子串然后检查重复元素,于是出现了好多层循环。。。。pass

于是换个思路,求到j为止 包括第j个字符的最长不重复子串。原问题的解必然是其中的一个到j(包括j)的最长子串。思想是不是很像最长子序列和.....为了求mx(j),可以根据

mx(j-1)。

如果str[j]没有在mx(j-1)中出现,mx(j)=mx(j-1)+1;

如果str[j]在mx(j-1)中出现,i为str[j]出现的位置。mx(j)=str(i+1,j);

于是写出O(n*n)算法。

class Solution {public:    int lengthOfLongestSubstring(string s) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.    if(!s.size())        return 0;    int mm=1;    int n=s.size();    int i=0;    int j=1;    while(j<n)    {        bool flag=true;        for(int k=i;k<j;k++)        {            if(s[j]==s[k])            {                flag=false;                i=k+1;                break;            }        }        if(flag)            mm=max(mm,j-i+1);        j++;    }    return mm;    }};

当然如果字符串只含有字母a~z那么可以使用hashtable将算法优化到O(n);当然考虑很多字符也可以hash。。。。

主要是迭代区间求解的过程中,hash[26]记录j之前字母‘a’+i出现的下标。于是查找j是否在mx(j-1)出现就会在O(1)时间内完成。

str[j]如果在mx(j-1)中出现,那么hash[str[j]-'a']所记录的下标必然是在i j之间,没有出现的情况是hash中记录的下标在i之前。更新hash即可。。。。


如果有不正确的地方,请大家给予指正,谢谢。向你们学习


原创粉丝点击