• leetcode 3. Longest Substring Without Repeating Characters


    题目内容

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

    Example:
    Input: "abcabcbb"
    Output: 3 
    Explanation: The answer is "abc", with the length of 3. 
    Example 2:
    
    Input: "bbbbb"
    Output: 1
    Explanation: The answer is "b", with the length of 1.
    Example 3:
    
    Input: "pwwkew"
    Output: 3
    Explanation: 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.
    

    分析过程

    • 题目归类:
      array,遍历,dp
    • 题目分析:
      找到连续字串,输出最长的没有重复字母的连续字串。
      采用循环法一定可以做出来,但是时间复杂度太差,最差是O(n^2),因为每次子串增长1都需要遍历一次看看有没有重复的数据,可以用一个hashmap来记录子串的数据。其中key为 char,value 为 index。那么每次做的就是
      1. 定义 i,j 分别为字串的起始和终点,创建一个HashMap 保存所有在ij 中的数据。
        2.查询index = map.get(String.charAt(j))是否在ij之间,如果在,*(当i==j时不更新)将hashmap 更新,并把i = index+1;计算一个sum的值。
    • 边界分析:
      • 空值分析、
        如果string 为 null 则返回null
      • 循环边界分析
        j的值不大于string.size();
    • 方法分析:
      • 数据结构分析
        hashmap保存数据可以降低循环的次数。
      • 状态机
      • 状态转移方程
      • 最优解
    • 测试用例构建
      [],
      [a,a,a,a]
      [a]
      [abca]

    代码实现

    import java.util.*;
    class Solution {
        public int lengthOfLongestSubstring(String s) {
            if(s == null || s.length()==0)
                return 0;
            int sum = 1;
            HashMap<Character,Integer> map = new HashMap<>();
            int i = 0;
            for(int j = 0 ; j < s.length();j++){
                char ch = s.charAt(j);
                if(map.containsKey(ch)){
                    int index = map.get(ch);
                    if(sum < j-i)
                        sum = j-i;
                    for(;i<=index;i++)
                        map.remove(s.charAt(i));
                    i = index+1;
                }
                 map.put(ch,j);
            }
            if(sum >= s.length()-i)
                return sum;
            else
                return s.length()-i;
        }
    }
    

    题目内容

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

    Example:
    Input: "abcabcbb"
    Output: 3 
    Explanation: The answer is "abc", with the length of 3. 
    Example 2:
    
    Input: "bbbbb"
    Output: 1
    Explanation: The answer is "b", with the length of 1.
    Example 3:
    
    Input: "pwwkew"
    Output: 3
    Explanation: 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.
    

    分析过程

    • 题目归类:
      array,遍历,dp
    • 题目分析:
      找到连续字串,输出最长的没有重复字母的连续字串。
      采用循环法一定可以做出来,但是时间复杂度太差,最差是O(n^2),因为每次子串增长1都需要遍历一次看看有没有重复的数据,可以用一个hashmap来记录子串的数据。其中key为 char,value 为 index。那么每次做的就是
      1. 定义 i,j 分别为字串的起始和终点,创建一个HashMap 保存所有在ij 中的数据。
        2.查询index = map.get(String.charAt(j))是否在ij之间,如果在,*(当i==j时不更新)将hashmap 更新,并把i = index+1;计算一个sum的值。
    • 边界分析:
      • 空值分析、
        如果string 为 null 则返回null
      • 循环边界分析
        j的值不大于string.size();
    • 方法分析:
      • 数据结构分析
        hashmap保存数据可以降低循环的次数。
      • 状态机
      • 状态转移方程
      • 最优解
    • 测试用例构建
      [],
      [a,a,a,a]
      [a]
      [abca]

    代码实现

    import java.util.*;
    class Solution {
        public int lengthOfLongestSubstring(String s) {
            if(s == null || s.length()==0)
                return 0;
            int sum = 1;
            HashMap<Character,Integer> map = new HashMap<>();
            int i = 0;
            for(int j = 0 ; j < s.length();j++){
                char ch = s.charAt(j);
                if(map.containsKey(ch)){
                    int index = map.get(ch);
                    if(sum < j-i)
                        sum = j-i;
                    for(;i<=index;i++)
                        map.remove(s.charAt(i));
                    i = index+1;
                }
                 map.put(ch,j);
            }
            if(sum >= s.length()-i)
                return sum;
            else
                return s.length()-i;
        }
    }
    

    效率提高

    一种更好的方法就是不用每次都清理hashmap,可以保持hashmap只不过判断时候 i = Math.max(i,map.get(s.charAt(j))+1);

    拓展问题

    Longest Substring with At Most Two Distinct Characters
    Medium
    Longest Substring with At Most K Distinct Characters
    Hard
    Subarrays with K Different Integers
    Hard

  • 相关阅读:
    OC基础--常用类的初步介绍与简单使用之NSDate
    mysql创建自定义函数与存储过程
    Hibernate Session 获取connection
    mysql中isnull,ifnull,nullif的用法
    mysql数据库中某项其中一个值在该项排第几,百分几
    linux下的ImageMagick安装方法
    Java 判断操作系统类型(适用于各种操作系统)
    tesseract 字体训练资料篇
    structDemo1
    C语言中.h和.c文件解析(很精彩)
  • 原文地址:https://www.cnblogs.com/clnsx/p/12272610.html
Copyright © 2020-2023  润新知