題目描述請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。
示例 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 分析 維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則...