LeetCode-3.无重复字符的最长字串

it2022-05-05  168

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

  示例 1:

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

  示例 2:

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

  

 

  题目思路:建立hashmap,记载每个字符出现的位置,并设变量index记载子串起始的下标,然后从下标为0开始遍历字符串   遍历到下标i时,此时有两种情况:   1.hashmap中没有该字符s.charAt(i)或者hashmap中有该字符s.charAt(i),但该字符map.get()不在index后,此时可以直接map.put(),添加或替换数据   2.hasmap中有该字符s.charAt(i)并且map.get()在index后,此时代表有重复字符,计算此时的字串,并使index=重复字符下标+1,最后map.put()替换数据

  

  详细说明例子:  (i为遍历下标,char为s.charAt(i),index为子串开始下标)

   输入:“abcabcbb”

  第一次遍历:i=0,char=a,进入情况1,index=0,子串:“a”,map中(a:0)

  第二次遍历:i=1,char=b,进入情况1,index=0,子串:“ab”,map中(a:0,b:1)

  第三次遍历:i=2,char=c,进入情况1,index=0,子串:“abc”,map中(a:0,b:1,c:2)

  第四次遍历:i=3,char=a,进入情况2,因为map.get(a)=0>=index,所以有重复数据a,计算此时的子串长度(3-0=3),与最大长度比较,并让index+=1,更新map数据

        index=1,子串:“bca”,map中(b:1,c:2,a:3)

  第 i 次遍历:以此类推

 

  

1 import java.util.HashMap; 2 class Solution { 3 public int lengthOfLongestSubstring(String s) { 4 //建立hashmap,记载每个字符出现的位置 5 HashMap<Character,Integer> map=new HashMap<>(); 6 //记载起始的下标 7 int index=0; 8 int maxlen=Integer.MIN_VALUE; 9 if(s.length()==0) 10 return 0; 11 //遍历字符串 12 for(int i=0;i<s.length();i++){ 13 //得到下标为i的字符 14 char c=s.charAt(i); 15 //情况2 16 if(map.containsKey(c)&&map.get(c)>=index){ 17 //此时子串长度与maxlen比较,更新maxlen 18 maxlen=(i-index)>maxlen?i-index:maxlen; 19 //使index=重复字符下标+1,避开重复字符 20 index=map.get(c)+1; 21 } 22 //更新map 23 map.put(c,i); 24 } 25 //最后再比较一次,以防止"abcdefg"该情况出现 26 maxlen=(s.length()-index)>maxlen?s.length()-index:maxlen; 27 return maxlen; 28 } 29 }

 

转载于:https://www.cnblogs.com/lyh28/p/10631203.html


最新回复(0)