leetcode:无重复字符的最长字串(详解)

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


一、题目描述?

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

leetcode:无重复字符的最长字串(详解),leetcode,算法,java

二、题解

方案一:容易理解(时间复杂度O(n))

   public int lengthOfLongestSubstring(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        int start=0,max=0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(map.containsKey(c)){
                start=Math.max(start,map.get(c)+1);
            }
            map.put(c,i);
            max=Math.max(max,i-start+1);
        }
        return  max;
    }
  1. HashMap<Character, Integer> map = new HashMap<>();创建一个HashMap,用于存储字符及其最后一次出现的位置。

  2. int max = 0;: 用于记录最长子串的长度。

  3. int start = 0;: 用于记录当前子串的起始位置。

  4. for (int i = 0; i < s.length(); i++) {: 遍历输入字符串。

  5. char ch = s.charAt(i);: 获取当前遍历到的字符。

  6. if (map.containsKey(ch)) { … }: 如果当前字符已经在子串中出现过。

  7. start = Math.max(map.get(ch) + 1, start);: 更新子串的起始位置,确保不包含重复字符。

  8. max = Math.max(max, i - start + 1);: 计算当前子串的长度并更新最大长度。

  9. map.put(ch, i);: 将字符及其位置放入HashMap。

  10. 最后返回最长子串的长度 max。

方案二:滑动窗口(时间复杂度O(n))

  public int lengthOfLongestSubstring(String s) {
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        int rk = -1, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }

这段代码使用了滑动窗口的思想。文章来源地址https://www.toymoban.com/news/detail-836622.html

  1. 初始化一个哈希集合 occ,用于记录每个字符是否出现过。
  2. 定义两个指针 rk 和 i,初始时 rk 为 -1,i 为 0。rk 代表窗口的右边界,i 代表窗口的左边界,初始时窗口大小为 0。
  3. 开始遍历字符串 s 的每个字符:
  • 如果 i 不等于 0,说明窗口已经开始移动了,我们需要将窗口左边界向右移动一格,这时候就需要将原来窗口左边界的字符从哈希集合中移除。
  • 在右边界 rk 小于字符串长度 n 且当前字符 s.charAt(rk + 1) 不在哈希集合中时,循环执行以下操作:
  • 将当前字符 s.charAt(rk + 1) 添加到哈希集合 occ 中。
  • 将右边界 rk 右移一格。
  • 计算当前窗口大小,并更新最长子串长度 ans。
  1. 返回最长子串长度 ans。

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

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

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

相关文章

  • python - leetcode - 424. 替换后的最长重复字符【经典题解 - 贪心滑动窗口算法】

    描述: 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后,返回包含相同字母的最长子字符串的长度。 示例 1: 示例 2: 提示: 1 = s.length = 105 s 仅由大写英文字母组成 0 =

    2024年02月16日
    浏览(48)
  • (中等)LeetCode 3. 无重复字符到的最长子串 Java

    滑动窗口 以示例一为例,找出 从每一个字符开始的,不包含重复字符的最长子串 ,那么,其中最长的那个字符串即为答案。 当我们一次递增地枚举子串的起始位置,会发现子串的结束位置也是递增的,原因在于,假设选择字符串中的第k个字符作为起始位置,并且得到了不

    2024年02月17日
    浏览(42)
  • LeetCode 3 无重复字符的最长子串

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 示例 2: 示例 3: 提示: 0 = s.length = 5 * 104 s 由英文字母、数字、符号和空格组成 依次遍历字符串,如果这个字符在子串里,则把子串的这个字符之前的都删除,加新的字符,否则继续遍历即可。

    2024年02月07日
    浏览(37)
  • 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)
  • 【LeetCode-中等题】3. 无重复字符的最长子串

    思路: 设置一个左指针,来判断下一个元素是否在set集合中,如果不在,就加入集合,right继续++,如果在,就剔除重复的元素,计算串的长度,在执行上述操作 代码:

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

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

    2024年02月11日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包