LeetCode刷題筆記 3
阿新 • • 發佈:2018-11-26
題目:
給定一個字串,找出最長的沒有重複字元的子字串的長度。
我的答案:(Java)
整體思路:
建立雜湊表,依次遍歷字串中的字元,雜湊表中有則去掉對應位及之前的鍵值,沒有則按續加入雜湊表。
第一次提交
import java.util.*; class Solution { public int lengthOfLongestSubstring(String s) { Hashtable<Character,Integer> map = new Hashtable<>(); int i,j,k,flag=0,max=0; for (i = 0; i < s.length(); i++) { if(map.containsKey(s.charAt(i))){ k = map.get(s.charAt(i)); for(j = flag;j <= k;j++){ map.remove(s.charAt(j)); } if((i-flag)>max) { max = i-flag; } flag = k+1; map.put(s.charAt(i), i); } else{ map.put(s.charAt(i), i); } } return max; } }
報錯
計算最大字串長度時邏輯有問題。
第二次提交
import java.util.*; class Solution { public int lengthOfLongestSubstring(String s) { Hashtable<Character,Integer> map = new Hashtable<>(); int i,j,k,flag=0,max=0,max_flag=0; for (i = 0; i < s.length(); i++) { //如果表中含有此鍵值,則刪掉該位及之前的鍵值,將新的鍵值加入到雜湊表中 if(map.containsKey(s.charAt(i))){ k = map.get(s.charAt(i)); for(j = flag;j <= k;j++){ map.remove(s.charAt(j)); max = max-1; } flag = k+1; map.put(s.charAt(i), i); max = max+1; } else{ map.put(s.charAt(i), i); max = max+1; } if(max > max_flag) max_flag = max; } return max_flag; } }
成功
答案:
方法一:遍歷所有子字串,在沒有重複字元的字串裡尋找最大長度。
時間複雜度O(n3)
方法二:採用開始和結束索引定義滑動視窗
public class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length(); Set<Character> set = new HashSet<>(); int ans = 0, i = 0, j = 0; while (i < n && j < n) { // try to extend the range [i, j] if (!set.contains(s.charAt(j))){ set.add(s.charAt(j++)); ans = Math.max(ans, j - i); } else { set.remove(s.charAt(i++)); } } return ans; } }
時間複雜度O(2n) = O(n)
空間複雜度O(min(m,n))
答案三:滑動視窗優化,不是令i一點一點增大,而是直接跳到重複點的位置。(和我的思路大致相同,只不過我在計算最大長度時採用了計算最終長度的方法,方法略顯囉嗦)
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>(); // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
}
時間複雜度O(n)
空間複雜度O(min(m,n))
需要注意的地方:
- 雜湊表及字串相關方法要抄對(如.containsKey())
- 滑動窗口的思想