【leetcode】無重複字符的最長子串-動態規劃-PHP實現

問題描述

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章