1. 程式人生 > 資訊 >固態硬碟 2020 年出貨 3.33 億塊 ,超越機械硬碟

固態硬碟 2020 年出貨 3.33 億塊 ,超越機械硬碟

技術標籤:刷題

劍指 Offer 48. 最長不含重複字元的子字串

請從字串中找出一個最長的不包含重複字元的子字串,計算該最長子字串的長度。

輸入: "abcabcbb"
輸出: 3 
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是"wke",所以其長度為 3。
    請注意,你的答案必須是 子串 的長度,"pwke"是一個子序列,不是子串。

這題好像以前做過,但是忘記怎麼做了。直接看題解吧。。。

面試題48. 最長不含重複字元的子字串(動態規劃 / 雙指標 + 雜湊表,清晰圖解) - 最長不含重複字元的子字串 - 力扣(LeetCode) (leetcode-cn.com)

雜湊表+動態規劃

設動態規劃列表 d p dp dp d p [ j ] dp[j] dp[j]代表以字元 s [ j ] s[j] s[j] 為結尾的 “最長不重複子字串” 的長度。

雜湊表統計: 遍歷字串 s s s時,使用雜湊表(記為 d i c dic dic)統計 各字元最後一次出現的索引位置

image-20210128111135385

class Solution {
    public
int lengthOfLongestSubstring(String s) { Map<Character, Integer> dic = new HashMap<>(); int res = 0, tmp = 0; for(int j = 0; j < s.length(); j++) { int i = dic.getOrDefault(s.charAt(j), -1); // 獲取索引 i dic.put(s.charAt(j), j); // 更新雜湊表 tmp =
tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j] res = Math.max(res, tmp); // max(dp[j - 1], dp[j]) } return res; } }