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

示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

自己想当然的用了两个循环做,结果毫无悬念,超时。。。。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0){
            return 0;
        }
       String maxStr = "";
        String maxStr2 = maxStr;
        int mark = 1;
        String str = maxStr;//当前字符串
        for(int j=0;j<s.length();j++){
            for(int i=j;i<s.length();i++){
                if(str.contains(s.charAt(i)+"")){
                    if(mark>maxStr.length()){
                        maxStr = str;
                    }
                    mark =1;
                    str = s.charAt(i)+"";
                }else{
                    str += s.charAt(i);
                    mark +=1;
                    if(str.length()>maxStr.length()){
                        maxStr = str;
                    }
                }
            }
            maxStr2 = maxStr.length()>maxStr2.length()?maxStr:maxStr2;
            maxStr = "";
            str = "";
        }
        return maxStr2.length();
    }
}

LeetCode-3.无重复子串
我不服,还真的有暴力解决不了的问题?

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int mark = 0;
        for(int i=0;i<s.length();i++){
            for(int j=0;j<s.length();j++){
                if(isUnique(s,i,j)){
                    mark = Math.max(mark,j-i+1);
                }
            }
        }
        return mark;
    }
    public boolean isUnique(String s,int start,int end){
        String str = "";
        for(int i=start;i<=end;i++){
            if(str.contains(s.charAt(i)+"")){
                return false;
            }
            str += s.charAt(i)+"";
        }
        return true;
    }
}

然后…哈哈哈哈 时间复杂度还是O(n^3),结果和上面一样的啊。。。
然后提交的时候丢了n行这么个样例,直接气哭????

“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!”#%&amp;&#x27;()*+,-./:;&lt;=&gt;[email protected][\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\&quot;#%&’()*+,-./:;<=>(这个样例还有n行这么一长串的字符串,自然而然的就爆掉了。。。)

小弟智商不高,加上没刷过题,只能去看题解了。。。。


看了题解,第一个题解是暴力就不说了,它的暴力time也是O(n^3),和我上面写法一个意思,应该也没法A吧(没提交过题解里暴力法的代码)
第二个,使用滑动窗口(第一次看到这个名词,但很好理解)…看了一遍这个题解后照着这个思路写出来A了

LeetCode-3.无重复子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int mark = 0,i=0,j=0;
        while(i<s.length()&&j<s.length()){
            if(isUnique(s,i,j)){
                mark = Math.max(mark,j-i+1);
                j++;
            }else{
                i++;
            }
        }
        return mark;
    }
    public boolean isUnique(String s,int start,int end){
        String str = "";
        for(int i=start;i<=end;i++){
            if(str.contains(s.charAt(i)+"")){
                return false;
            }
            str += s.charAt(i)+"";
        }
        return true;
    }
}

虽然A了,不过结果不太好,耗时一秒多,这也太gay了吧!!!
LeetCode-3.无重复子串

到最后了,上一个在评论里看到的代码吧,真是人比人气死人!!!!
简直是神仙代码,和最后一个优化了的题解是一个思路,不过这个老哥是用python写的,
刚开始我还看不懂,后面翻题解翻到最后一个优化解,官网给了解释才看懂。。。。
最后这个代码我只是看看,看懂了就没有动手写了,毕竟自己的思维目前还没达到这么高,我还在考虑怎样才能暴力不超时的时候,大佬就已经最优A了

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        st = {}
        i, ans = 0, 0
        for j in range(len(s)):
            if s[j] in st:
                i = max(st[s[j]], i)
            ans = max(ans, j - i + 1)
            st[s[j]] = j + 1
        return ans;

相关文章: