[剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]
【問題描述】[第3題][無重復字符的最長字串]
給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。示例 1:輸入: "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。 示例 2:輸入: "bbbbb" 輸出: 1 解釋: 因為無重復字符的最長子串是 "b",所以其長度為 1。【解答思路】
1. 滑動窗口之 HashMap
時間復雜度:O(N) 空間復雜度:O(N)
public int lengthOfLongestSubstring(String s) {int n = s.length();int ans = 0;Map<Character,Integer> map = new HashMap<>();for(int start=0,end=0; end < n ; end ++){char alpha = s.charAt(end);if(map.containsKey(alpha)){start = Math.max(map.get(alpha), start);}ans = Math.max(ans,end-start +1);//記錄start應該調整到哪里map.put(s.charAt(end),end+1);}return ans;}2. 滑動窗口之HashSet
時間復雜度:O(N) 空間復雜度:O(N)
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;} class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合,記錄每個字符是否出現過Set<Character> occ = new HashSet<Character>();int n = s.length();// 右指針,初始值為 -1,相當于我們在字符串的左邊界的左側,還沒有開始移動int rk = -1, ans = 0;for (int i = 0; i < n; ++i) {if (i != 0) {// 左指針向右移動一格,移除一個字符occ.remove(s.charAt(i - 1));}while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {// 不斷地移動右指針occ.add(s.charAt(rk + 1));++rk;}// 第 i 到 rk 個字符是一個極長的無重復字符子串ans = Math.max(ans, rk - i + 1);}return ans;} }2. 滑動窗口之 數組(本質HashMap)
時間復雜度:O(N) 空間復雜度:O(N)
public int lengthOfLongestSubstring(String s) {//128個字符 int[] m = new int[128];int len = 0;//i: start j:end for(int i = 0, j = 0; j < s.length(); j++){i = Math.max(m[s.charAt(j)], i);len = Math.max(len, j - i + 1);//記錄i應該調整到哪里m[s.charAt(j)] = j + 1;}return len;}【總結】
1. 滑動窗口思想 常用于字符數組題目中
- 更新start(+1)
- 邊界思考清楚 start end 迭代
2.Java String 類
3.HashMap 或 HashSet常見用法
3.1 HashSet
(1)增加
public boolean add(E e);
(2)刪除
public boolean remove(Object j);
(3)對比查找
public boolean contains(Object j);
(4)清空集合
public void clear();
(5)獲取長度
public int size();
3.2 HashMap
(1) 插入鍵值對數據
public V put(K key, V value)
(2)根據鍵值獲取鍵值對值數據
public V get(Object key)
(3)獲取Map中鍵值對的個數
public int size()
(4)判斷Map集合中是否包含鍵為key的鍵值對
public boolean containsKey(Object key)
(5)判斷Map集合中是否包含值為value的鍵值對
boolean containsValue(Object value)
(6)判斷Map集合中是否沒有任何鍵值對
public boolean isEmpty()
(7)清空Map集合中所有的鍵值對
public void clear()
(8)根據鍵值刪除Map中鍵值對
public V remove(Object key)
總結
以上是生活随笔為你收集整理的[剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ansible 五(inventory文
- 下一篇: matlab在机电一体化的仿真图,基于s