leetcode3 无重复字符的最长子串

先说结论:自己没做出来,抄的别人的。

https://www.cnblogs.com/ariel-dreamland/p/8668286.html


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

示例:

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

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

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


思路:

循环字符串,找下一个相同的字符,计算间隔。写了半天发现是错的。。。凉凉因为aab都过不了。。。


暴力搜索:

循环所有字符串,两个循环,然后还要再判断这个里面重复不。用set来做。最后超时了。凉凉。。。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        set<char> myset;
        int res=0;
        for(int i=0;i<s.size()-1;i++)
            for(int j=0;j<s.size();j++){
                string s1(s,i,j-i);
                for(int k=0;k<s1.size();k++){
                    if(!myset.insert(s1[k]).second)
                        break;
                }
                if(res<myset.size())
                    res=myset.size();
                myset.clear();
                s1.clear();
            }
        return res;
    }
};

优化了一下,让i从0到n-1;j从n开始往前走j--,如果发现不重复的子串,就没有必要再往前走了。但是还是超时了。。。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        set<char> myset;
        int res=0;
        int flag=0;
        int success=0;
        for(int i=0;i<s.size()-1;i++){
            success=0;
            for(int j=s.size();j>i;j--){
                string s1(s,i,j-i);
                for(int k=0;k<s1.size();k++){
                    if(!myset.insert(s1[k]).second)
                    {
                        flag=1;//insert fail -- substring has same character
                        break;
                    }
                }
                if(!flag){//insert success for substring whose characters are all different 
                    if(res<myset.size())
                        res=myset.size();
                    success=1;//no need to decrease j
                    flag=0;
                    myset.clear();
                    s1.clear();
                    break;
                }
                flag=success=0;
                myset.clear();
                s1.clear();
            }
        }
        return res;
    }
};

又不甘心,再优化,感觉myset插入的时候太耗时间,改为手动排序子字符串,结果还是超时啊。。。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
       // set<char> myset;
        int res=0;
        int flag=0;
        int success=0;
        for(int i=0;i<s.size()-1;i++){
            success=0;
            for(int j=s.size();j>i;j--){
                string s1(s,i,j-i);
                sort(s1.begin(),s1.end());
                for(int k=0;k<s1.size()-1;k++){
                    if(s1[k]==s1[k+1])
                        flag=1;
                }
                if(!flag){//insert success for substring whose characters are all different 
                    if(res<s1.size())
                        res=s1.size();
                    success=1;//no need to decrease j
                    flag=0;
                   // myset.clear();
                    s1.clear();
                    break;
                }
                flag=success=0;
                //myset.clear();
                s1.clear();
            }
        }
        return res;
    }
};

心态崩了。。。去看看人家的吧。

这个博客讲的太好:

LeetCode(3):无重复字符的最长子串


猜你喜欢

转载自blog.csdn.net/m0_37561165/article/details/80912850