最長不含重複字符的子字符串|刷題打卡

1、題目描述:

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

示例 1:markdown

輸入: "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。spa

示例 2:指針

輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。code

2、思路分析

看完題的第一想法就是動態滑塊orm

  1. 把i-j之間的字符串存起來,存在一個隊列中,$maxDiffStr,方便下次查驗

  1. 繼續向後找,直到找到$maxDiffStr中存在的值隊列

  2. 將隊列$maxDiffStr依次彈出,直到彈出的值與當前循環的值相等字符串

  3. 此時從新計算maxLenstring

3、代碼編寫

class Solution {

    /** * @param String $s * @return Integer */
    function lengthOfLongestSubstring($s) {
        $len = strlen($s);
        if ($len < 1) {
            return 0;
        }

        $maxLen = 1;
        $maxDiffStr = [$s[0]];
        for ($i=1; $i < $len; $i++) {
            if (in_array($s[$i], $maxDiffStr)) {  
                while (array_shift($maxDiffStr) !== $s[$i]) {}
            }
            $maxDiffStr[] = $s[$i];
            $maxLen = $maxLen > count($maxDiffStr) ? $maxLen : count($maxDiffStr);
        }
        return $maxLen;
    }
}
複製代碼

看了大佬的題解,果真更好的方法還差很遠it

雙指針+哈希表

class Solution {

    /** * @param String $s * @return Integer */
    function lengthOfLongestSubstring($s) {
        $dic = [];
        $res = 0;
        $i = -1;
        $len = strlen($s);
        for ($j=0; $j < $len; $j++) {
            if (isset($dic[$s[$j]])) {
                $i = max($dic[$s[$j]], $i);
            }
            $dic[$s[$j]] = $j;
            $res = max($res, $j-$i);
        }
        return $res;
    }
}
複製代碼

刷題打卡第一天,小菜菜在路上。。。

相關文章
相關標籤/搜索