题目
题目链接:
https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7
思路
用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况:“bacbca”这里的a上次出现的index比c上次出现的index早如果按a上次出现的index字符串就变成: cbca这就有重复的所以: i = max(i, preIndex(a))这样就能保证是不重复的字符串重点:以每个位置i结尾往左推推多远,下面2个之一:i位置当前字符上次的位置能推多远p1i-1位置往左推的距离 p2
参考答案Java
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param s string字符串* @return int整型*/public int lengthOfLongestSubstring (String s) {/*用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况:“bacbca”这里的a上次出现的index比c上次出现的index早如果按a上次出现的index字符串就变成: cbca这就有重复的所以: i = max(i, preIndex(a))这样就能保证是不重复的字符串以每个位置i结尾往左推推多远,下面2个之一:i位置当前字符上次的位置能推多远p1i-1位置往左推的距离 p2*/if (s == null || s.length() == 0) return 0;int[] map = new int[256];for (int i = 1; i < 256 ; i++) {map[i] = -1;}int ans = 1;int pre = 1; //上一个位置,向左推了多长map[s.charAt(0)] = 0;for (int i = 1; i < s.length() ; i++) {int p1 = i - map[s.charAt(i)];int p2 = pre + 1;int cur = Math.min(p1, p2);ans = Math.max(ans, cur);pre = cur;map[s.charAt(i)] = i;}return ans;}
}
参考答案Go
package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param s string字符串* @return int整型*/
func lengthOfLongestSubstring(s string) int {/*用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况:“bacbca”这里的a上次出现的index比c上次出现的index早如果按a上次出现的index字符串就变成: cbca这就有重复的所以: i = max(i, preIndex(a))这样就能保证是不重复的字符串以每个位置i结尾往左推推多远,下面2个之一:i位置当前字符上次的位置能推多远p1i-1位置往左推的距离 p2*/if len(s) == 0 {return 0}m := [256]int{}for i := 1; i < 256; i++ {m[i-1] = -1}res := 1pre := 1 //i-1位置能往左推多远m[s[0]] = 0for i := 1; i < len(s); i++ {p1 := i - m[s[i]]p2 := pre + 1cur := p1if cur > p2 {cur = p2}if cur > res {res = cur}pre = curm[s[i]] = i}return res
}
参考答案PHP
<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param s string字符串 * @return int整型*/
function lengthOfLongestSubstring( $s )
{ /*用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况:“bacbca”这里的a上次出现的index比c上次出现的index早如果按a上次出现的index字符串就变成: cbca这就有重复的所以: i = max(i, preIndex(a))这样就能保证是不重复的字符串以每个位置i结尾往左推推多远,下面2个之一:i位置当前字符上次的位置能推多远p1i-1位置往左推的距离 p2*/if($s ==null || strlen($s) ==0)return 0;$map =array();for($i=0;$i<strlen($s);$i++){if(!isset($map[$s[$i]]))$map[$s[$i]] =-1;}$res = 1;$pre =1;// i-1位置能往左推多远$map[$s[0]] =0;for($i=1;$i<strlen($s);$i++){$p1 = $i-$map[$s[$i]];$p2 = $pre+1;$cur =$p1;if($cur > $p2)$cur =$p2;if($res < $cur){$res = $cur;}$pre =$cur;$map[$s[$i]] =$i;}return $res;}