蘇寧註冊 “蘇寧不止賣家電還賣家裝有限公司”商標
阿新 • • 發佈:2021-02-08
技術標籤:刷題
劍指 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)統計 各字元最後一次出現的索引位置
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;
}
}