問題描述
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
分析
這個問題使用動態規劃法對問題進行結構
動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。動態規劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。
這個問題實際上是屬於多階段決策問題。
前兩個字符沒有重複 -> 判斷連上第三個字符是否重複 -> 不重複就增加一位,然後繼續判斷下一個;重複則結束,返回字符串
每個階段的判斷方式都是一樣的,可以抽象出來。
function compare($s,$i){
$str = $s[$i]; //return $str;
$j = $i - 1 ;
while($j >= 0 && !strstr($str,$s[$j])){
$str.=$s[$j];
$j -=1;
}
return strlen($str);
}
上面把判斷的階段抽象了出來,那麼再通過判斷狀態,找到最長的返回值,就得到了結果。
解
class Solution {
/**
* @param String $s
* @return Integer
*/
function lengthOfLongestSubstring($s) {
if($s == ""){ //判斷空字符串
return 0;
}
$len = 0;
for($i=0;$i < strlen($s);$i++){
$len = max($len, $this->compare($s, $i));
}
return $len;
}
//比較
function compare($s,$i){
$str = $s[$i]; //return $str;
$j = $i - 1 ;
while($j >= 0 && !strstr($str,$s[$j])){
$str.=$s[$j];
$j -=1;
}
return strlen($str);
}
}
執行用時 : 236 ms , 在所有 PHP 提交中擊敗了 20.56% 的用戶
內存消耗 : 15 MB , 在所有 PHP 提交中擊敗了 65.45% 的用戶
參考資料
- https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
- https://baike.baidu.com/item/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92