日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode笔记】3. 无重复字符的最长子串(JAVA、滑动窗口、字符串)

發(fā)布時間:2024/7/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】3. 无重复字符的最长子串(JAVA、滑动窗口、字符串) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 && 代碼
      • 1. 之前的版本
      • 更新 2.0

題目描述

  • 子串:各字符間必須要相鄰,而非子序列
  • 使用滑動窗口來做就行

思路 && 代碼

1. 之前的版本

  • 思路:維護一個滑動窗口,滑動窗口中容納一個無重復字符的子串。
  • 滑動窗口左邊界移動的情況:
  • 【abc】 a => a【bca】
  • 【abcd】 c => abc【dc】
  • 其實以上兩種情況殊途同歸,都是把左邊界換成當前判斷字符在HashMap中對應的下標的位置的后一個
    然后把前面的字符全都丟棄即可(在HashMap中remove())。
  • 左邊界移動的情況,需要進行長度的判斷:當前滑動窗口長度可能會改變,如果比當前存儲的最大長度要大,那么就需要更新。
  • 為什么可以這樣子:特別記錄一下,這道題其實老早就通過了。。但是之后考慮情況多了,出現(xiàn)了覺得自己寫的代碼其實考慮不周,但是就是過了的情況= =。
    主要是有這個注意點:在上面的左邊界移動情況2,考慮到abc都被丟棄,但是有沒有可能a、b實際上可能可以創(chuàng)造最長子串呢? 答案是沒有,因為實際上最多的長度【abcd】已經(jīng)被記錄下來了,b最多就是【bcd】c的情況,a也同理,因此已經(jīng)可以直接丟棄掉了。
class Solution {public int lengthOfLongestSubstring(String s) {int len=0, lenNow=0;HashMap<Character,Integer> hashMap = new HashMap<>();for(int i=0;i<s.length();i++){if(hashMap.containsKey(s.charAt(i))){// 和left.char相同的情況下,可以繼續(xù)// 這個if是個優(yōu)化,但是其實刪掉也可以,之后的代碼對于這種情況達到一樣的效果if(hashMap.get(s.charAt(i))==i-lenNow){hashMap.put(s.charAt(i),i);continue;}// 否則需要把前面的全刪了len = Math.max(len,lenNow);// 獲取當前重復值的下標。int temp = hashMap.get(s.charAt(i));// 維護哈希表:把不需要的映射remove掉。for(int j = i-lenNow;j<=temp;j++){hashMap.remove(s.charAt(j),j);}// 更新當前滑動窗口的長度lenNow = i - temp;hashMap.put(s.charAt(i),i);}else{hashMap.put(s.charAt(i),i);lenNow++;}}// 一直數(shù)到字符串結束的情況,補一個補充return Math.max(len,lenNow);} }
  • 時間復雜度:O(N),實際上整個流程本質上就是對字符串的每一個元素都必然訪問一次可能刪除一次
  • 空間復雜度:O(字符集的大小),因為我們需要簡歷哈希表,而表最大的情況下會容納整個字符集(及對應下標)。

更新 2.0

  • 比較精簡的代碼
class Solution {public int lengthOfLongestSubstring(String s) {// initint len = s.length();int max = 0;char[] arr = s.toCharArray();// <字符,字符出現(xiàn)下標>Map<Character, Integer> hashmap = new HashMap<>();int windowLeft = 0;for(int i = 0; i < len; i++) {// Case 1 重復if(hashmap.containsKey(arr[i])) {int index = hashmap.get(arr[i]);for(int j = windowLeft; j <= index; j++) {hashmap.remove(arr[j]);}windowLeft = index + 1;hashmap.put(arr[i], i);}// Case 2 沒重復else {hashmap.put(arr[i], i);max = Math.max(max, hashmap.size());}}return max;} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】3. 无重复字符的最长子串(JAVA、滑动窗口、字符串)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。