leetcode 3. 无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列  而不是子串。

解法一:

思路:每次顺序读取s的一个元素s[i],用s1存读取的互异的字串;每读取一个元素s[i],用它逆序遍历s1,如果发现s1中某一元素s1[j]和s[i]相等,则从j+1直到s1尾部截取s1并把s[i]加到s1后面。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s == "") return 0;
        string s1,s2;//s2用来重置s1
        s1 = s1 + s[0];//s1用来存互异的字串
        int len = 1;
        for(int i = 1; i < s.length(); ++i){
            bool flag = 1;//判断下面的for循环是否完整执行
            for(int j = s1.length()-1; j >= 0; --j){
                if(s[i] == s1[j]){
                    flag = 0;
                    if(s[i] == s[i-1]){//如果要判断的s[i]和它的上一位相等,则清空当前的s1
                        s1=s2+s[i];
                        len = max(len,int(s1.length()));//每次改变s1的时候更新len
                        break;
                    }
                    s1 = s1.substr(j+1) + s[i];
                    len = max(len,int(s1.length()));//每次改变s1的时候更新len
                    break;
                }
            }
            if(flag) s1 = s1 + s[i];//for循环完整执行则在s1后加上s[i]
            len = max(len,int(s1.length()));//每次改变s1的时候更新len
        }
        return len;
    }
};

解法二:

利用hash表的思想,建立一个256的数组来存每个字符对应的值。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int a[256] = {0};
        int l = 0,n = 0;//l表示无重复字串的长度,n表示无重复字串的左边界
        for(int i = 0;i < s.size();++i){
            if(a[s[i]] == 0 || a[s[i]] < n){
                l = max(l,i-n+1);
            }else{
                n = a[s[i]];
            }
            a[s[i]] = i+1;
        }
        return l;
    }
};

猜你喜欢

转载自blog.csdn.net/u011750466/article/details/80113132