91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用LeetCode怎么實現無重復字符的最長子串

發布時間:2021-08-05 16:17:55 來源:億速云 閱讀:374 作者:Leah 欄目:編程語言

本篇文章為大家展示了使用LeetCode怎么實現無重復字符的最長子串,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

描述

給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。

示例 1:

輸入: s = "abcabcbb"
輸出: 3 
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3

示例 2:

輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是 "wke",所以其長度為 3。
  請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

示例 4:

輸入: s = ""
輸出: 0
0 <= s.length <= 5 * 104
s 由英文字母、數字、符號和空格組成

Solution

解法

暴力思路

檢查重復字符串的思路有哪些?

  • 兩次遍歷循環字符串

    • 存入之前判斷Set中是否已經存在字符串

    • 計算最新的結果長度,并且將當前字符串存入到Set

    • 每當第二次循環完成之后,清空Set,防止影響下一個第一層循環的數據

    • 有則BREAK,進入下一個外層循環

    • 第一層循環記錄頭部信息

    • 第二層循環用來滑動數據

    • 將第二層數據存入到Set

使用LeetCode怎么實現無重復字符的最長子串

CODE
class Solution {
     public int lengthOfLongestSubstring(String s) {
       int res = 0 ;
       Set<Character> set = new HashSet<>();
       for(int i = 0 ; i < s.length();i++){
           for(int j = i ; j < s.length() ; j++){
               if(set.contains(s.charAt(j))){
                  break;
               }
               if(j-i+1 > res){
                   res = j-i+1;
               }
               set.add(s.charAt(j));
           }
           set.clear();
       }
       return res;
    }
}
復雜度
  • 時間復雜度:O(N^2)NS的長度

結果
  • 執行用時:99 ms, 在所有 Java 提交中擊敗了12.37%的用戶

  • 內存消耗:38.7 MB, 在所有 Java 提交中擊敗了39.62%的用戶

雙指針版本

解題思路

雙指針,又名滑動窗口,其實就是一個隊列,比如例題中的 abcabcbb,進入這個隊列(窗口)為 abc 滿足題目要求,當再進入 a,隊列變成了 abca,這時候不滿足要求。所以,我們要移動這個隊列!

使用LeetCode怎么實現無重復字符的最長子串

1,從A ->ABC

當前Left為0,Right為2,整體的結果最大長度為3,緩存cache中已經有了數據{A:0,B:1,C:2}

使用LeetCode怎么實現無重復字符的最長子串

2. ABCA

當再次遇到A時,緩存cache中已經存在了A字符串,我們需要比較【當前A在緩存中的位置】,與【當前Left的值】,如果Left的值小于等于A在緩存中的位置,那么我們需要調整Left的值為(A在緩存中的位置 + 1),這么做主要是為了Left坐標始終處于最新的重合點的位置的后面一位,組成新的不重合的長度

使用LeetCode怎么實現無重復字符的最長子串

  1. ABCAB

跟上面同理,當遇到B時,緩存中已經存在了B字符串,需要比較【當前B在緩存中的位置】,與【當前Left的值】,如果Left的值小于等于``B在緩存中的位置,那么久需要調整Left的值為(B在緩存中的位置+1),最終是為了Left坐標始終處于最新的重合點(B)的位置的后面一位,組成新的不重合的長度

CODE
class Solution {
     public int lengthOfLongestSubstring(String s) {
         
       int length = s.length();
       if(length == 0){
           return 0;
       }
       int res = 0 ;
       //快指針
       int right = 0 ;
       //慢指針 
       int left = 0 ;
       //索引,空間換時間
       Map<Character,Integer> map = new HashMap<>();
       for(;right<length;right++){
           Character c = s.charAt(right);
        if(map.containsKey(c)){
            //更新left
            if( map.get(c) >= left){
                    left = map.get(c)+1;
            }
        }
        //更新結果res
        if((right-left+1)>res){
                res = (right-left+1);
        }
         //更新c的位置
        map.put(c,right);

       }
       return res ;
    }
}
復雜度
  • 時間復雜度:O(N)N為字符串長度

結果
  • 執行用時:7 ms, 在所有 Java 提交中擊敗了79.24%的用戶

  • 內存消耗:38.8 MB, 在所有 Java 提交中擊敗了28.63%的用戶

上述內容就是使用LeetCode怎么實現無重復字符的最長子串,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

威海市| 金堂县| 瑞金市| 永新县| 滕州市| 伊金霍洛旗| 宕昌县| 禹州市| 唐海县| 天全县| 综艺| 上蔡县| 桓仁| 绩溪县| 浦县| 祥云县| 奈曼旗| 昂仁县| 广灵县| 蓬安县| 资阳市| 三穗县| 古浪县| 水富县| 麟游县| 日喀则市| 板桥市| 云林县| 息烽县| 济源市| 怀来县| 延边| 竹山县| 牡丹江市| 蛟河市| 夏河县| 邵东县| 页游| 会泽县| 馆陶县| 泰兴市|