leetcode3-无重复字符的最长子串

原题

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解法

思想

滑动窗口,将出现的字符和下标在哈希表中对应起来。

该问题的关键是获取所有不重复字符子串的长度,比较出最大的长度,我们用last记录当前计算的子串的第一个字符位置。

那么不重复字符子串的长度的计算方法就是:

假设从last开始都是不重复字符,如果遇到一个在哈希集中出现过的字符并且是last或last之后的,说明遇到了重复字符,如下图的d,则此时的不重复字符子串adv的长度为第二个d之前的长度3-0=3。然后将last移到v上(第一个d后面的那个元素,这样新子串中就不会有两个d了),便可继续进行操作。

这样依次进行无重复字符子串的长度计算,当最后遍历到最后一个字符c的时候,都和last以及last之后出现的字符无重复,那么此时最后计算的子串vdfc的长度是5-2+1=4(因为c是计入子串的)
leetcode3-无重复字符的最长子串

那么假设最后一个字符是v,当最后遍历到最后一个字符v的时候,和当前子串中的v重复了(vdfv),那么和之前计算子串长度的方法一样是5-2=3(最后一个v不计入长度)

leetcode3-无重复字符的最长子串

代码

Java

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character,Integer> map = new HashMap<>();
        int max = 0;
        int last = 0;
        char[] chars = s.toCharArray();
        for(int i = 0;i<chars.length;i++){
            if(map.containsKey(chars[i])&&map.get(chars[i])>=last){
                if(i-last>=max) max = i-last;
                last = map.get(chars[i]) + 1;
            }else if(i == chars.length-1&&i-last+1>=max){
                max = i-last+1;
            }
            map.put(chars[i],i);
        }
        return max;
    }
}

Go(2020/07/05)

func lengthOfLongestSubstring(s string) int {
    start := 0
    max := 0
    m := map[byte]int{}
    for i,c := range []byte(s){
        if v,ok := m[c]; ok && v >= start{
            if i-v > max { max = i-v }
            start = v + 1 
        }else{
            if i-start+1 > max {max = i-start+1}
        }
        m[c] = i
    }
    return max
}

go需要注意,如果需要兼容中文字符串,需要怎么处理:

func lengthOfLongestSubstring(s string) int {
    start := 0
    max := 0
    m := map[rune]int{}
    for i,c := range []rune(s){
        if v,ok := m[c]; ok && v >= start{
            if i-v > max { max = i-v }
            start = v + 1 
        }else{
            if i-start+1 > max {max = i-start+1}
        }
        m[c] = i
    }
    return max
}

(2024/3/24)

func lengthOfLongestSubstring(s string) int {
    start := -1
    end := -1
    var maxLen int
    charPos := map[byte]int{}
    for {
        end ++
        if end == len(s){
            break
        }
        lastPos, ok := charPos[s[end]]
        if !ok || lastPos < start{
            maxLen = max(maxLen, end - start)
        } else{
            start = lastPos
        }
        charPos[s[end]] = end
    }
    return maxLen
}

Python

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        m = {}
        start = 0
        maxLen = 0
        for i,c in enumerate(s):
            v = m.get(c)
            if v != None and v >= start:
                maxLen = max(i-v,maxLen)
                start = v+1
            else:
                maxLen = max(i-start+1,maxLen)
            m[c] = i
        return maxLen

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode3-%e6%97%a0%e9%87%8d%e5%a4%8d%e5%ad%97%e7%ac%a6%e7%9a%84%e6%9c%80%e9%95%bf%e5%ad%90%e4%b8%b2/

(0)
彭晨涛彭晨涛管理者
上一篇 2019年12月26日
下一篇 2019年12月27日

相关推荐

  • leetcode1014-最佳观光组合

    原题 给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。 一对景点(i < j)组成的观光组合的得分为(A[i]…

    算法 2020年6月17日
    01950
  • leetcode67-二进制求和

    原题 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” …

    算法 2019年11月15日
    0100
  • leetcode733-图像渲染

    原题 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一…

    2019年12月13日
    0100
  • leetcode108-将有序数组转换为二叉搜索树

    原题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数…

    算法 2020年1月18日
    090
  • 蓝桥杯试题-翻硬币

    原题 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写…

    算法 2020年3月1日
    0140
  • leetcode313-超级丑数

    原题 编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。 示例: 输入: n = 12, primes = [2…

    算法 2020年2月11日
    0110
  • leetcode42-接雨水

    原题 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高…

    2020年1月23日
    0300
  • 剑指offer03-数组中重复的数字

    原题(来源Leetcode) 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,…

    算法 2020年3月13日
    0140
  • leetcode283-移动零

    原题 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说…

    算法 2019年11月23日
    0110
  • leetcode83-删除排序链表中的重复元素

    今天打算多刷几道算法题 原题 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->…

    算法 2020年6月16日
    01350

发表回复

登录后才能评论