import java.util.HashMap; /* 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 解题思路: 维护一个hashmap<char,index> */ public class p3 { public static int lengthOfLongestSubstring(String s) { int maxLen=0,tmplen=0,left=0; int len=s.length(); if(len==0)return 0; if(len==1)return 1; HashMap<Character,Integer> map=new HashMap<>(); char arr[]=s.toCharArray(); for(int i=0;i<arr.length;i++){ if(!map.containsKey(arr[i])){//若不存在该键值 map.put(arr[i],i); tmplen++; maxLen=Math.max(tmplen,maxLen); } else{//遍历到已经有了 int index=map.get(arr[i]); left=Math.max(left,index+1); tmplen=i-left+1; maxLen=Math.max(tmplen,maxLen); map.put(arr[i],i); } } return maxLen; } public static void main(String[] args) { System.out.println(lengthOfLongestSubstring("pwwkew")); } }
运行结果: