畫解算法:3. 無重複字符的最長子串

題目連接

leetcode-cn.com/problems/lo…java

題目描述

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

示例 1:bash

輸入: "abcabcbb"
輸出: 3 
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。
複製代碼

示例 2:數據結構

輸入: "bbbbb"
輸出: 1
解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。
複製代碼

示例 3:spa

輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
複製代碼

解題方案

思路

  • 標籤:滑動窗口
  • 暴力解法時間複雜度較高,會達到O(n^2),故而採起滑動窗口的方法下降時間複雜度
  • 定義一個map數據結構存儲(k,v),其中key值爲字符,value值爲字符位置+1,加1表示從字符位置後一個纔開始不重複
  • 咱們定義不重複子串的開始位置爲start,結束位置爲end
  • 隨着end不斷遍歷向後,會遇到與[start, end]區間內字符相同的狀況,此時將字符做爲key值,獲取其value值,並更新start,此時[start, end]區間內不存在重複字符
  • 不管是否更新start,都會更新其map數據結構和結果ans。
  • 時間複雜度:O(n)

代碼

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int end = 0, start = 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);
            map.put(s.charAt(end), end + 1);
        }
        return ans;
    }
}
複製代碼

畫解

fr<x>ame_00001.png
fr<x>ame_00002.png
fr<x>ame_00003.png
fr<x>ame_00004.png
fr<x>ame_00005.png
fr<x>ame_00006.png
fr<x>ame_00007.png
fr<x>ame_00008.png

後臺回覆「算法」,加入每天算法羣 以爲算法直擊靈魂,歡迎點擊在看轉發3d

相關文章
相關標籤/搜索