用 PHP 在 力扣 上演算法 [無重複字元的最長子串]{一天一更}

666666發表於2020-05-15

題目:

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

示例 1:

輸入: “abcabcbb”
輸出: 3
解釋: 因為無重複字元的最長子串是 “abc”,所以其長度為 3。
示例 2:

輸入: “bbbbb”
輸出: 1
解釋: 因為無重複字元的最長子串是 “b”,所以其長度為 1。
示例 3:

輸入: “pwwkew”
輸出: 3
解釋: 因為無重複字元的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,”pwke” 是一個子序列,不是子串。

解析:

此題當我看到的時候,感覺解法有點多了,官方又說用滑動視窗,我特麼滑不動啊,怎麼辦呢?
還是用萬能的陣列吧,因為HashMap在PHP中就是陣列的體現呀。解釋在程式碼註解上:

解法:

function lengthOfLongestSubstring($s) {
        // 邊界條件判斷
        if (!isset($s) || strlen($s) == 0) {
            return 0;
        }
        // 定義一個 HashMap ,裝字串中的 索引和值
        $array = [];
        // 計算的最大長度
        $maxlen = 0;
        // 開始位置
        $index = 0;
        for ($i=0; $i < strlen($s); $i++) { 
            // 在定義的HashMap中檢視 是不是存在字元的map,並且開始位置要小於等於map的值
            // 
            if (isset($array[$s[$i]]) && $index <= $array[$s[$i]]) {
                // 成立則讓開始位置等於 map值加 1
                $index = $array[$s[$i]] + 1;
            } else {
                // 在 Map 中沒有,那就計算長度
                $maxlen = max($maxlen, $i-$index + 1);
            }
            // 將每個字元都加進去 Map 中
            $array[$s[$i]] = $i;
        }
        return $maxlen;
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

join_jiang

相關文章