最長不含重複字元的子字串

2021-10-09 07:30:28 字數 1802 閱讀 3905

題目描述

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

示例 1:

輸入: "abcabcbb"

輸出: 3

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

示例 2:

輸入: "bbbbb"

輸出: 1

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

示例 3:

輸入: "pwwkew"

輸出: 3

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

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

動態規劃

為什麼要使用動態規劃?我們想要求str(0, i)字串中最長不含重複字元的子串,可以這樣考慮:假設我們已經求出了str(0, i-1)中的最長子串長度,現在考慮上str(i)字元,看看加上str(i)之後,str(0, i)字串的最長子串長度是多少

於是我們定義dp[i]的含義為:以str[i]結尾的最長不重複子串的長度。我們遍歷字串中每乙個字元:for (int i = 1; i < str.length(); i++)

int[

] dp =

newint

[str.

length()

];dp[0]

=1;// 單個字元的最長不重複子串長度為 1

int maxlength =1;

// 預設最大值為 1

// 遍歷陣列中每個字元

for(

int i =

1; i < str.

length()

; i++)}

// 以 str[i] 結尾的最長不重複子串的長度

dp[i]

= i - j;

// 整個字串的長不重複子串的長度

maxlength = math.

max(maxlength, dp[i]);

}return maxlength;

}}

優化思路

使用map代替內層for迴圈

在上述**的內層迴圈:for (j = i - 1; j >= i - dp[i - 1]; j--)

// key 是字元,value 是該字元上一次在字串**現的位置

mapmap =

newhashmap

<

>()

;int maxlength =0;

int lastlength =0;

// 遍歷字串中每個字元

for(

int i =

0; i < str.

length()

; i++

)else

// 更新字串最長不重複字串的最大值

maxlength = math.

max(lastlength, maxlength);}

return maxlength;

}}

最長不含重複字元的子字串

題目 輸入乙個字串,找出字串中最長的不含重複字元的子字串,計算該子字串的長度。假設字串中的字元為 a z 例如 arabcacfr 最長的字串為 rabc 和 acfr 長度為 4 int find max len string str else dp str i a i return max le...

最長不含重複字元的子字串

題目 請從字串中找出乙個最長的不包含重複字元的子 字串,計算該最長子字串的長度。假設字串中只包 含 a z 的字元。例如,在字串 arabcacfr 中,最長的不含重複字元 的子字串是 acfr 長度為 4。分析 f i 表示第i個字元為結尾的不包含重複字元的子字串的最大長度。如果第i個字元之前沒有...

最長不含重複字元的子字串

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從 a 到 z 的字元。例如,在字串中 arabcacfr 最長非重複子字串為 acfr 長度為4。暴力,o n o n 分析 維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則...