zoukankan      html  css  js  c++  java
  • LeetCode-3.无重复字符的最长字串

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

      示例 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 }
  • 相关阅读:
    关于Class.forName(“com.mysql.jdbc.Driver”)
    Vector既然继承了AbstractList为啥还要实现List接口
    推荐两个支持Java的云主机空间
    关于“Return empty arrays or collections, not nulls”的思考
    "win7回收站已损坏"解决方法
    ibatis中使用like模糊查询
    当你升级到ubuntu12.04之后
    转一篇:如何快速的修改参考文献
    Java Annotations初探
    用eclipse开发android,xmllayout文件不自动提示,Java代码可以自动提示
  • 原文地址:https://www.cnblogs.com/lyh28/p/10631203.html
Copyright © 2011-2022 走看看