zoukankan      html  css  js  c++  java
  • leetcode 3 无重复字符的最长子串

    这是刚刚学到的算法——滑动窗口法Sliding Window, 题目如下

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    
    示例 1:
    
    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    示例 2:
    
    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    示例 3:
    
    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。···
    

    题解

    先说滑动窗口法是怎么工作的,滑动窗口法借助哈希表实现,我把它理解为有两个窗口——左窗口和右窗口,对着这道题来说,左窗口和右窗口会包住一个区间,这个区间里的所有字母都是没有重复的,举个栗子,对于字符串abcadc来说
    一开始左窗口右窗口都在0的位置,并且我们有一个hashMap,hashMap记录字母最后一次出现的位置。
    出事状况为下面,当前最大非重复子串长度为 0
    【】abcadc
    然后右窗口向右移动,当前最大非重复子串长度为 右窗口-左窗口+1 =1,hashMap = {“a”:0}
    【a】bcadc
    此时窗口里的字符串没有重复字符,右窗口继续移动,当前最大非重复子串长度为 右窗口-左窗口+1 =2,hashMap = {“a”:0,“b”:“1”}
    【ab】cadc
    此时窗口里的字符串没有重复字符,右窗口继续移动,当前最大非重复子串长度为3,hashMap = {“a”:0,“b”:“1”,“c”:2}
    【abc】adc
    此时窗口里的字符串没有重复字符,右窗口向右移动,此时出现了重复字符a,我们借助hashMap知道,上一次a出现的地方是0,所以我们把左窗口推进到0+1的位置,最大非重复子串长度为右窗口-左窗口+1 = 3,a。hashMap = {“a”:3,“b”:“1”,“c”:2}
    a【bca】dc
    此时窗口里的字符串没有重复字符,右窗口向右移动,最大非重复子串长度为右窗口-左窗口+1 = 4,hashMap = {“a”:3,“b”:“1”,“c”:2,“d”:4}
    a【bcad】c
    此时窗口里的字符串没有重复字符,右窗口向右移动,我们发现c已经出现过了,并且出现过的位置是2,左窗口移到2+1处,hashMap = {“a”:3,“b”:“1”,“c”:5,“d”:4},最大非重复子串长度为右窗口-左窗口+1 = 3。
    abc【adc】
    接下来三步省略。
    这个过程中出现的最大的非重复子串长度为4,所以我们的答案是4.
    有了思路后很容易得到我们的代码

    import java.util.ArrayList;
    import java.util.HashMap;
    
    
    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            int  ans = 0;
            HashMap<Character, Integer> map = new HashMap<>();
            int leftWindow=0,rightWindow = 0;
            for (; rightWindow < s.length(); rightWindow++) {
                if (map.containsKey(s.charAt(rightWindow))){
                    leftWindow = Math.max(leftWindow, map.get(s.charAt(rightWindow))+1);
                } 
                map.put(s.charAt(rightWindow), rightWindow);
                ans = Math.max(ans, rightWindow-leftWindow+1); 
            }
            return ans;
        }
    }
    
  • 相关阅读:
    自学Linux命令的四种方法
    POJ 1170 Shopping Offers -- 动态规划(虐心的六重循环啊!!!)
    九度OJ 1447 最短路 1008 最短路径问题
    九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
    PHPActiveRecord 学习三
    PHPUnit 组织测试
    PHPActiveRecord validates
    PHPActiveRecord 学习二
    PHPActiveRecord 学习一
    PHP ActiveRecord demo栗子中 关于类名 的问题
  • 原文地址:https://www.cnblogs.com/yfc0818/p/11072576.html
Copyright © 2011-2022 走看看