zoukankan      html  css  js  c++  java
  • LeetCode 3. Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters.

    Examples:

    Given "abcabcbb", the answer is "abc", which the length is 3.

    Given "bbbbb", the answer is "b", with the length of 1.

    Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.


    【题目分析】

    给定一个字符串,求出其包含的最长的子串的长度。


    【思路】

    我们设置一个数组来记录以当前字符串结尾的子串的长度,然后遍历数组找出最长的子串即可。那么如果来计算以每一个字符串结尾的子串的长度呢?

    以"abcabcbb"为例:

    1. 初始时以每一个字符串结尾的子串的长度设置为0

    2. 构造一个Map用来保存已经遍历到的字符,初始时仅包含第一个字符 {}

    3. 从第一个字符开始遍历,如果map中没有包含该字符,那么subStringLengthEndWithCurChar = subStringLengthEndWithLastChar + 1.

      如果map中已经有该字符,我们看一下它是否包含在以上一个字符结尾的子串当中,如果包含:那么以上个子串结尾的字符串从上一个当前字符处截断,然后长度加1,否则的话:继续在上个字符串的基础上长度加1.

    4. 开始遍历

    5.map = {(a,0)}

    6. map = {(a,0),(b,1)}

    7. map = {(a,0),(b,1),(c,2)}

    8. map = {(a,3),(b,1),(c,2)}

    9. map = {(a,3),(b,4),(c,2)}

    10. map = {(a,3),(b,4),(c,5)}

    11. map = {(a,3),(b,6),(c,5)}

    12. map = {(a,3),(b,7),(c,2)}结束


    【java代码】

     1 public class Solution {
     2     public static int lengthOfLongestSubstring(String s) {
     3         if(s.length() <= 0) return 0;
     4         int[] lengthNum = new int[s.length()];
     5         Map<Character, Integer> index = new HashMap<>();
     6 
     7         int max = 0;
     8         for(int i = 0; i < s.length(); i++) {
     9             if(!index.containsKey(s.charAt(i))) {
    10                 lengthNum[i] = lengthNum[i-1] + 1;
    11             }
    12             else if(i - index.get(s.charAt(i)) <= lengthNum[i-1]) {
    13                 lengthNum[i] = i - index.get(s.charAt(i));
    14             }
    15             else{
    16                 lengthNum[i] = lengthNum[i-1] + 1;
    17             }
    18             index.put(s.charAt(i), i);
    19         }
    20         for(int i = 0; i < s.length(); i++) {
    21             max = Math.max(max, lengthNum[i]);
    22         }
    23         return max;
    24     }
    25 }
  • 相关阅读:
    分公司下拉框赋值-从后台传到前端jsp
    EASYUI DATAGRID加合计
    Quartz_TimeJob例子(C#)
    JAVA项目如何打开,打开乱码怎么办,字体太小怎么办,感叹号是什么情况
    下拉框设置下拉列表宽度
    获取dataset结果集的第一行第一列字段
    安装visio冲突
    ubuntu创建普通用户,解决远程登录失败
    ubuntu中文环境配置
    stackoverflow访问慢
  • 原文地址:https://www.cnblogs.com/liujinhong/p/6026302.html
Copyright © 2011-2022 走看看