算法之无重复字符的最长子串

2019.10.30 - 宅先生

题目描述:

        给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

        示例 1:

                输入: "abcabcbb"

                输出:3 

                解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。

        示例 2:

                输入: "bbbbb"

                输出:1

                解释::因为无重复字符的最长子串是 "b",所以其长度为 1。

        示例 3:

                输入: "pwwkew"

                输出::3

                解释::因为无重复字符的最长子串是 "wke",所以其长度为 3。

                请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路:

        ①初始化无重复最长子串长度为$len = 0,然后从第一位的字符开始,逐个查找在其之前的子串$temp_str中是否存在与之重复的字符;

        ②如果有,那么从该字符在$temp_str中首次出现的位置+1处开始截取$temp_str,作为新的$temp_str;

        ③如果没有,那么将该字符追加到$temp_str中,作为新的$temp_str;

        ④比较最新的字符串$temp_str长度与$len的大小,取较大的值作为新的$len,然后进行下一位字符的循环,最终无重复最长子串长度为$len。

代码实现:

function lengthOfLongestSubstring($s) {
$lens = strlen($s); //总的字符串有多长
$temp_str = ''; //用于存储子串 当前里面不会有重复的字符
$len = 0; //最长子串的长度
for($i=0; $i < $lens; $i++) {
$re = strpos($temp_str, $s[$i]); //判断是否有重复的
if(false !== $re) { //有重复
$temp_str .= $s[$i]; //先追加上去 例如pww
$temp_str = substr($temp_str, $re+1); //从重复位置开始 截取后 pww=>w
}else { //无重复字符
$temp_str .= $s[$i]; //追加到后面
}
//每一次过去后,比较当前的temp_str 与上一次的 len 谁更大
$len = strlen($temp_str) > $len ? strlen($temp_str) : $len;
}
return $len; //最后返回的长度不一定是$temp_str
}


- END -

各位看官,如果你觉得文章不错,请鼓励鼓励吧~~

ECShop和Discuz完美整合方案(下)

三:同步注册的实现 关于同步注册,主要实现两点:①在ecshop中完成注册操作之后,ecshop和Discuz同时自动处于登陆状态;②在Discuz中完成注册操作以后,Discuz和ecshop同时自动处于登陆状态。

取消

您的支持,是我继续创作的动力!

扫码支持
人生百态皆无常,最是一颗感恩心

打开支付宝扫一扫,即可进行扫码打赏

所得打赏均用于域名续费、服务器租赁等维持平台正常运营的必要支出。

海报生成中...