leetcode-3.无重复字符的最长子串
2020-02-06 本文已影响0人
简简天天
3.无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
- 方法一
class Solution
{
/**
* 3. 无重复字符的最长子串
* @param string $s
* @return int
*/
public function lengthOfLongestSubstring($s)
{
// 字符串拆分成数组
$len = strlen($s);
if($len == 0 || $len == 1){return $len;}
$arr = str_split($s);
$maxLen = 1; // 假设最大长度为1
// 遍历找出不子串并计算字
for ($i = 0; $i < $len; $i++) {
$tmpArr = [];
for ($j = $i; $j < $len; $j++) {
if (in_array($arr[$j], $tmpArr)) {
$maxLen = count($tmpArr) > $maxLen ? count($tmpArr) : $maxLen;
break;
} else {
$tmpArr[] = $arr[$j];
}
}
if($j == $len){
$maxLen = count($tmpArr) > $maxLen ? count($tmpArr) : $maxLen;
break;
}
}
// 返回最大长度
return $maxLen;
}
}
$solution = new Solution();
$s = 'pwwkew';
print_r($solution->lengthOfLongestSubstring($s));
- 方法二
class Solution
{
/**
* 3. 无重复字符的最长子串
* @param string $s
* @return int
*/
public function lengthOfLongestSubstring($s){
$len = strlen($s); // 字符串长度
if(($len == 0) || ($len == 1)){
return $len;
}
$maxLen = 0; // 初始化最长字串长度为0
$maxStr = ''; // 初始化最长字串
for($i = 0; $i < $len; $i++){
$res = strpos($maxStr, $s[$i]);
$maxStr .= $s[$i];
if($res !== false){
$maxStr = substr($maxStr, $res + 1);
}
$maxLen = $maxLen > strlen($maxStr) ? $maxLen : strlen($maxStr);
}
return $maxLen;
}
}
$solution = new Solution();
$s = 'pwwkew';
print_r($solution->lengthOfLongestSubstring($s));
- 方法三
class Solution
{
/**
* 3. 无重复字符的最长子串
* @param string $s
* @return int
*/
public function lengthOfLongestSubstring($s){
$len = strlen($s);
if($len == 0 || $len == 1){
return $len;
}
$maxLen = 0;
$i = $j = 0;
$arr = [];
while ($i < $len - $maxLen && $j < $len) {
if (isset($arr[$s[$j]])) { // 数组中已经存在$s[$j]
unset($arr[$s[$i]]);
$i++;
} else { // 数组中不存在$s[$j],放到$arr
$arr[$s[$j]] = $j;
$j++;
if ($j - $i > $maxLen) {
$maxLen = $j - $i;
}
}
}
return $maxLen;
}
}
$solution = new Solution();
$s = 'pwwkew';
print_r($solution->lengthOfLongestSubstring($s));
- 方法四
class Solution
{
/**
* 3. 无重复字符的最长子串
* @param string $s
* @return int
*/
public function lengthOfLongestSubstring($s){
$len = strlen($s);
if(($len == 0) || ($len == 1)){
return $len;
}
$findStr = '';
for($i=0;$i<$len;$i++){
$pos = strrpos($findStr, $s[$i]);
if($pos!==false){
$findStr=substr($findStr,$pos+1);
}
$findStr.= $s[$i];
$lens[] = strlen($findStr);
}
return max($lens)?:0;
}
}
$solution = new Solution();
$s = 'pwwkew';
print_r($solution->lengthOfLongestSubstring($s));
- 方法五
class Solution
{
/**
* 3. 无重复字符的最长子串
* @param string $s
* @return int
*/
public function lengthOfLongestSubstring($s){
$len = strlen($s);
if($len ==0 || $len == 1){
return $len;
}
$tempStr = '';
$maxLen = $length = 0;
for($i = 0; $i < $len; $i++){
$pos = strpos($tempStr, $s[$i]);
$tempStr .= $s[$i];
if ($pos !== false){
$tempStr = substr($tempStr, $pos + 1);
$length = strlen($tempStr);
}else{
$length++;
if($length > $maxLen){
$maxLen = $length;
}
}
}
return $maxLen;
}
}
$solution = new Solution();
$s = 'pwwkew';
print_r($solution->lengthOfLongestSubstring($s));
- 方法六
class Solution
{
/**
* 3. 无重复字符的最长子串
* @param string $s
* @return int
*/
public function lengthOfLongestSubString($s){
$len = strlen($s);
if($len == 0 || $len == 1){
return $len;
}
$map = [];
$maxLen = $left = 0;
for($i = 0; $i < $len; $i++){
if(array_key_exists($s[$i],$map)){
$left = max($left,$map[$s[$i]] + 1);
}
$map[$s[$i]] = $i;
$maxLen = max($maxLen,$i-$left+1);
}
return $maxLen;
}
}
$solution = new Solution();
$s = 'pwwkew';
print_r($solution->lengthOfLongestSubstring($s));
- 结果
3