8.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
思路:
left 控制当前窗口的左端,当前位置 i 为窗口的右端,自动加一不用控制。只需要比较新进入的字符 ss 窗口里有没有,如果有left需要指向窗口里 ss 的笑一个位置(因为新的ss需要进来,旧的ss不用保留)
用哈希存字符串中的字符以及对应下标,当出现重复字符时,需要改哈希中的下标。
要理解 left = Math.max(left,map.get(s.charAt(i)) + 1);需要回归到滑动窗口的原理上。
窗口中始终是无重复字母的字符串。
我们通过窗口的左界和右界控制窗口。
右界不用特意操作,因为它是+1,+1地涨上去,记得在循环里+1就好。
左界:每当有一个字符曾经出现过,就需要判断左界。
1 class Solution { 2 public int lengthOfLongestSubstring(String s) { 3 if(s.length()==0)return 0; 4 HashMap<Character ,Integer> map = new HashMap<Character ,Integer>(); 5 int max=0,left=0; 6 for(int i = 0 ; i<s.length() ;i++){ 7 char ss = s.charAt(i); 8 if(map.containsKey(ss)){ 9 left=Math.max(left,map.get(ss)+1); 10 } 11 map.put(ss,i); 12 max = Math.max(max,i-left+1); 13 } 14 return max; 15 } 16 }
还可以,虽然我没写出来

浙公网安备 33010602011771号