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

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

大家好,又见面了,我是全栈君。

精选文章

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

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

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

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

方法一

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
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111720.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 有关LVM快照的分享

    有关LVM快照的分享

  • java分页计算当前页_java分页计算[通俗易懂]

    java分页计算当前页_java分页计算[通俗易懂]java仿google的分页算法1.现将数据从数据库读取出来封装一个java类中,在java类中计算publicclassPage{//成员变量//当前页privateintnowpage;//总记录数privateintcountrecord;//总页数privateintcountpage;//当前页记录开始的位置privateintpageindex;//每页显示的…

  • @PostConstruct注解是Spring提供的?今天讲点不一样的「建议收藏」

    @PostConstruct注解是Spring提供的?今天讲点不一样的「建议收藏」前言我们在讲《Spring的Lifecycle》时提到,在Spring的使用中可以通过Lifecycle接口实现一些基于Spring容器生命周期逻辑。与此对照的就是通过@PostConstruct和@PreDestroy在Bean初始化或销毁时执行一些操作。很明显Spring的Lifecycle是基于容器的生命周期来处理逻辑,而@PostConstruct和@PreDestroy是基于Bean的生命周期来处理业务逻辑。这里很多朋友就产生了一个误解,以为@PostConstruct注解也是Spring提

    2022年10月21日
  • 微信支付_微信分付怎么借钱出来

    微信支付_微信分付怎么借钱出来微信支付

  • 学计算机应该怎样学,初学者该如何学习电脑知识

    学计算机应该怎样学,初学者该如何学习电脑知识看到不少刚入门的电脑刚入门者找不到适合自己的学习方法,到处碰壁,那么初学者该如何学习电脑知识呢?接下来大家跟着学习啦小编一起来了解一下学习电脑知识的解决方法吧。初学者学习电脑知识方法第一阶段:鼠标和键盘的操作鼠标的操作主要是:移动、拖动、单击、双击和右击,知道鼠标的作用以及基本操作。掌握键盘的操作,可以通过打字练习来完成,熟悉键盘排列,可以熟练打字。第二阶段:操作系统的学习对windowsxp的…

  • Jenkins首次安装选择推荐插件时出现“: No such plugin: cloudbees-folder” 解决方案

    说一下场景第一次安装Jenkins,访问http:ip:8080 ,输入管理员密码。然后选择社区推荐的插件安装方式,提示出现:安装过程中出现一个错误: No such plugin: cloudbees-folder原因很明显,就是没有上面提示这个插件导致。解决三步走主要思想是:先跳过推荐安装插件界面,使用手动上传插件的方式,然后手动上传Ok后,重新回到推荐插件安装界面,选择推荐插件…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号