• 用 PHP和Golang 来刷leetCode 之 无重复字符 最长子串


    精选文章

    免费获取Git GO Java视频教程
    Go语言生成二维码是如此简单

    涨见识| 字节PHP/Golang社招面经

    一文让你知道为什么学了PHP的都要转学Go语言

    方法一

    class Solution {
        /**
         * @param String $s
         * @return Integer
         */
        function lengthOfLongestSubstring($s) {
            if (strlen($s)==0) return 0;
            $map = [];
            $max = 0;
            $left = 0;
            for($i = 0; $i < strlen($s); $i++){
                if(array_key_exists($s[$i],$map)){
                    $left = max($left, $map[$s[$i]] + 1);
                }
                $map[$s[$i]] = $i;
                $max = max($max,$i-$left+1);
            }
            return $max;
        }
    }
    

    方法二:

    思路:逐个检查所有的子字符串,看它是否包含有重复的字符。

    $str = "";
    function lengthOfLongestSubstring($s) {
        $strlen = strlen($s);
        if($strlen<=1){
            return $strlen;
        }
        $subStrlen = [];
    
    
        for($i=0;$i<$strlen;$i++){
            $subStrArr = [];
            $subStrArr[] = $s[$i];
            for($j=$i+1;$j<$strlen;$j++){
                $subStrArr[] = $s[$j];
                if(count(array_unique($subStrArr))!=count($subStrArr)){
                    array_pop($subStrArr);
                    break;
                }
    
    
            }
            $subStrlen = count($subStrArr)>count($subStrlen)?$subStrArr:$subStrlen;
        }
        return count($subStrlen);
    }
    $a = lengthOfLongestSubstring($str);
    print_r($a)
    

    方法三

    如果从索引 i 到 j - 1 之间的子字符串s[i,j)已经被检查为没有重复字符。我们只需要检查 s[j] 对应的字符是否已经存在于子字符串 s[i,j) 中。

    function lengthOfLongestSubstring($s) {        $len = strlen($s);        if ($len < 2){            return $len;        }        $win = [];        $res_len = 0;        $i = 0;        $j = 0;        while ($i<$len && $j<$len){            if(!in_array($s[$i],$win)){                $win[]= $s[$i++];                $res_len = max($res_len,$i-$j);
                }else{                $j++;                array_shift($win);            }        }        return $res_len;    }
    

    嗯 简单试了一下 差不多是上面方法的20倍 并且随着字符串的长度增长会更大  因为他是O(n)  

    方法四:优化版滑动窗口

      function lengthOfLongestSubstring($s)
    {
            $len = strlen($s);
            $j = 0;
            $i = 0;
            $maxStrLen = 0;
            $set = [];
            while ($j<$len){
                if(array_key_exists($s[$j],$set)){
                    $i = max($i,$set[$s[$j]]);
    
    
                }
                $maxStrLen = max($maxStrLen,$j-$i+1);
                $set[$s[$j]]=$j+1;
                $j++;
            }
            return $maxStrLen;
        }
    

    使用Golang方法

    package main
    
    
    import "fmt"
    //最长不含有重复字符的子串
    func lenthOfNonRepeatingSubstr(s string) int {
      lastOccurred := make(map[byte]int)
      start := 0
      maxLength := 0
      for i, ch := range []byte(s) {
        if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
          start = lastI + 1
        }
        if i-start+1 > maxLength {
          maxLength = i - start + 1
        }
        lastOccurred[ch] = i
      }
      return maxLength
    }
    
    
    func main() {
      fmt.Println(lenthOfNonRepeatingSubstr("abcabcbb")) //3
      fmt.Println(lenthOfNonRepeatingSubstr("bbbbb"))    //1
      fmt.Println(lenthOfNonRepeatingSubstr("pwwkew"))   //3
    }
    

    赞赏码

    非学,无以致疑;非问,无以广识

  • 相关阅读:
    git 常用命令
    目录
    算法--双栈排序
    算法--栈的翻转练习题
    算法--双栈队列
    算法--可查询最值的栈练习题
    Spark算子--union、intersection、subtract
    Spark算子--take、top、takeOrdered
    Spark算子--countByKey
    Spark算子--SortBy
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452749.html
Copyright © 2020-2023  润新知