(中等)LeetCode 3. 无重复字符到的最长子串 Java

这篇具有很好参考价值的文章主要介绍了(中等)LeetCode 3. 无重复字符到的最长子串 Java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(中等)LeetCode 3. 无重复字符到的最长子串 Java,LeetCode,leetcode,java,算法

滑动窗口

以示例一为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么,其中最长的那个字符串即为答案。

当我们一次递增地枚举子串的起始位置,会发现子串的结束位置也是递增的,原因在于,假设选择字符串中的第k个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为 r k r_k rk,那么,从第k+1个字符作为起始位置时,首先从k+1到 r k r_k rk的字符显然是不重复的,并且由于少了原来的第k个字符,可以尝试继续增大 r k r_k rk,直到右侧出现重复字符为止

可以使用“滑动窗口”来解决这个问题:

  • 使用两个指针表示字符串中的某个子串(或窗口)的左右边界,其中左指针代表上文中的【枚举子串的起始位置】,而右指针即为文中的 r k r_k rk
  • 在每一步的操作中,将左指针向右移动一格,表示开始枚举下一个字符作为起始位置,然年后不断地向右移动指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串,记录下这个子串的长度

判断重复字符

在左指针向右移动的时候,从哈希集合中移除一个字符,在右指针向右移动时,向哈希集合中添加一个字符

import java.util.HashSet;
import java.util.Set;

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //哈希集合,记录每个字符是否出现过
        Set<Character> set = new HashSet<>();
        int n = s.length();

        //右指针,初始值为-1,相当于在字符串的左边界的左侧,还没有开始移动
        int rk = 0;
        int ans = 0;
        for (int i = 0; i < n; i++) {
            if (i != 0) {
                //左指针向右移动一格,移除一个字符
                set.remove(s.charAt(i - 1));
            }
            while (rk < n && !set.contains(s.charAt(rk))) {
                //不断地移动右指针
                set.add(s.charAt(rk));
                ++rk;
            }
            //第i个到rk个字符是一个最长的无重复字符子串
            ans = Math.max(ans, rk - i);
        }
        return ans;
    }
}

复杂度分析:

  • 时间复杂度:O(n),其中n是字符串的长度,左指针和右指针分别会遍历整个字符串一次
  • 空间复杂度:O( ∣ ∑ ∣ |\sum| ), ∣ ∑ ∣ |\sum| 表示字符集的大小。本题中没有明确说明字符集,因此可以默认为所有ASCII码在[0,128)内的字符。

(中等)LeetCode 3. 无重复字符到的最长子串 Java,LeetCode,leetcode,java,算法文章来源地址https://www.toymoban.com/news/detail-581404.html

到了这里,关于(中等)LeetCode 3. 无重复字符到的最长子串 Java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 3. 无重复字符的最长子串

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 我们需要找的是含重复元素的最长子串,当然直接暴力求解固然简单。但是可能引发的情况是超时,而且面试官想看到的也不是让你去暴力解决这类问题。因此我们使用哈希+滑动窗口的思想来解决。 使用哈希表的缘故是更

    2024年02月09日
    浏览(42)
  • 【Leetcode】3. 无重复字符的最长子串

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例1: 示例2: 示例3: 提示 : 0 = s . l e

    2024年02月10日
    浏览(38)
  • LeetCode3.无重复字符的最长子串

     虽然是一道中等题,但我5分钟就写完了,而且是看完题就知道怎么写,这一看就知道双指针,一个左一个右,右指针往后移如果没有重复的长度+1;如果有重复的,左指针往右移,那如何判断重复呢,这多简单,Hashset的congtains方法啊,所以一下子就写出来了,但是效率确实

    2024年02月11日
    浏览(38)
  • LeetCode 刷题 3. 无重复字符的最长子串

    给定一个字符串s,找出其中不包含重复字符的最长子串。 示例 1: 示例 2: 示例 3: 提示: 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 LeetCode官方详细解答

    2024年02月10日
    浏览(53)
  • LeetCode-C#-0003.无重复字符的最长子串

    该题目来源于LeetCode 如有侵权,立马删除。 解法不唯一,如有新解法可一同讨论。 0003无重复字符的最长子串 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为

    2024年02月08日
    浏览(39)
  • 【滑动窗口】leetcode3:无重复字符的最长子串

    无重复字符的最长子串 题目要求我们找符合要求的最长子串,要求是不能包含重复字符 确定一个子串只需确定它的左右区间即可,于是我们可以两层循环暴力枚举所有的子串,找到符合要求的,并通过比较得到最长的长度。还有一个问题,怎么确定有没有重复字符呢?可以

    2024年02月11日
    浏览(34)
  • 【LeetCode滑动窗口专题#2】无重复字符的最长子串

    #1传送门 滑动窗口最大值 长度最小的子数组 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = \\\"abcabcbb\\\" 输出: 3 解释: 因为无重复字符的最长子串是 \\\"abc\\\",所以其长度为 3。 示例 2: 输入: s = \\\"bbbbb\\\" 输出: 1 解释: 因为无重复字符的最长子串

    2024年02月08日
    浏览(42)
  • 【LeetCode】滑动窗口妙解无重复字符的最长子串

    Problem: 3. 无重复字符的最长子串 首先我们来分析一下本题的思路 如果读者有看过 长度最小的子数组 的话就可以清楚这个子串其实和子数组是一个道理,都是 连续的一段区间 但是呢它们本质上还是存在一定区别的,这里说到是要我们去寻找不含有重复字符的【最长子串】

    2024年02月07日
    浏览(39)
  • 每日一题:LeetCode-LCR 016. 无重复字符的最长子串

    前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈    🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉 算法 👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长

    2024年02月03日
    浏览(44)
  • leetcode:无重复字符的最长字串(详解)

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 HashMapCharacter, Integer map = new HashMap();创建一个HashMap,用于存储字符及其最后一次出现的位置。 int max = 0;: 用于记录最长子串的长度。 int start = 0;: 用于记录当前子串的起始位置。 for (int i = 0; i s.length(); i

    2024年02月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包