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;
        }
    }
    
  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/yfc0818/p/11072576.html
Copyright © 2011-2022 走看看