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

2021-10-10 23:28:31 字數 1285 閱讀 9686

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

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

s.length <= 40000

動態規劃解析:

狀態定義: 設動態規劃列表 dp ,dp[j] 代表以字元 s[j] 為結尾的 「最長不重複子字串」 的長度。

轉移方程: 固定右邊界 j ,設字元 s[j] 左邊距離最近的相同字元為 s[i] ,即 s[i] = s[j] 。

當 i < 0 ,即 s[j] 左邊無相同字元,則 dp[j] = dp[j-1] + 1;

當 dp[j - 1] < j - i,說明字元 s[i] 在子字串 dp[j-1] 區間之外 ,則 dp[j] = dp[j - 1] + 1;

當 dp[j−1] ≥ j−i ,說明字元 s[i] 在子字串 dp[j-1] 區間之中 ,則 dp[j] 的左邊界由 s[i] 決定,即 dp[j] = j - i;

當 i < 0時,由於 dp[j−1] ≤ j 恆成立,因而 dp[j−1] < j−i 恆成立,因此分支 1. 和 2. 可被合併。

由於返回值是取 dp 列表最大值,因此可借助變數 tmp 儲存 dp[j] ,變數 res 每輪更新最大值即可。

此優化可節省 dp 列表使用的 o(n) 大小的額外空間。

class

solution

return res;

}}。

class

solution

set.

add(c)

; res = math.

max(res, right-left);}

return res;

}}

最長不含重複字元的子字串(劍指offer 48)

找出乙個字串行中乙個最長的包含不重複字元的子字串,比如在字串 arabcacfr 中,最長的不含重複字元的子字串是 acfr 長度為4。使用暴力法可以在o n 2 的時間複雜度內找到字串行的所有字串,然後在o n 的時間複雜度內比較這個字串是否包含重複字元,因為暴力解的時間複雜度為o n 3 如果面...

劍指offer最長不含重複字元的子字串

題目 請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度,假設字串中只包含 a z 的字元。例如,在字串 arabcacfr 中,最長的不含重複字元的子字串是 acfr 長度為4.陣列 最長不重複的字串長度 動態規劃 public static void gui string s...

劍指offer 最長不含重複字元的子字串

找出乙個字串行中乙個最長的包含不重複字元的子字串,比如在字串 arabcacfr 中,最長的不含重複字元的子字串是 acfr 長度為4。用f i 表示以第i個字元結尾不包含重複字元的子字串的最長長度,從左向右掃瞄 1 若第i個字元在之前沒出現過,則 f i f i 1 1 2 若第i個字元在之前出現...