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 }
  • 相关阅读:
    [CF] Final Exam Arrangement
    [原创]9宫格填数字
    第二次结对编程作业
    第11组 团队展示
    第一次结对编程作业
    第一次个人编程作业
    第一次博客作业
    第二次结对编程作业
    第10组 团队展示
    第一次个人编程作业
  • 原文地址:https://www.cnblogs.com/liujinhong/p/6026302.html
Copyright © 2011-2022 走看看