【leetcode.3】无重复字符的最长子串

news/2024/5/20 10:26:49 标签: 滑动窗口

一、题目描述

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

示例 1:

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

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

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

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。


二、思路

(1)暴力解法

头指针指向头元素,尾指针从头元素开始,每遍历一个元素,就把该元素放入set中,并更新最大长度。当遇到重复的元素时,同样更新最大长度,并将头指针往后顺延一个,接着清空set,开始下一轮。

代码实现:

    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        if (s.length() == 1) {
            return 1;
        }

        Set<Character> set = new HashSet<>();
        int max = 0;

        for (int i = 0; i < s.length(); i++) {
            set.clear();
            char start = s.charAt(i);
            set.add(start);
            for (int j = i + 1; j < s.length(); j++) {
                char temp = s.charAt(j);
                if (!set.contains(temp)) {
                    set.add(temp);
                    max = Math.max(max, set.size());
                } else {
                    max = Math.max(max, set.size());
                    break;
                }
            }
        }
        return max;
    }

时间复杂度为O(n²),空间复杂度为O(n)。

提交答案:


(2)滑动窗口

设置一个start指针,指向子串首元素,再设置一个end指针,指向当前的子串尾元素。

一开始start=0,end=start,接着end自增,并将遍历过的字符作为key,其下标作为value,存入map中。一旦end指向的元素num发生重复,并且满足上一次出现的num元素的下标+1>start时(有可能上一次出现的num元素的下标+1小于start时,防止star倒退),使得start=上一次出现的num元素的下标+1。

代码实现:

    public int lengthOfLongestSubstring(String s) {
        int max = 0;
        int length = s.length();
        Map<Character, Integer> map = new HashMap<>();

        for (int start = 0, end = 0; end < length; end++) {
            char endChar = s.charAt(end);
            if (map.containsKey(endChar) && (map.get(endChar) + 1) > start) {
                start = map.get(endChar) + 1;
            }
            max = Math.max(max, end - start + 1);
            map.put(s.charAt(end), end);
        }
        return max;
    }

时间复杂度为O(n),空间复杂度也为O(n)。

提交答案:

 


http://www.niftyadmin.cn/n/1704694.html

相关文章

careercup-C和C++ 13.7

13.7 写一个函数&#xff0c;其中一个参数是指向Node结构的指针&#xff0c;返回传入数据结构的一份完全拷贝。 Node结构包含两个指针&#xff0c;指向另外两个Node。 C实现代码&#xff1a; typedef map<Node*, Node*> NodeMap; Node* copy_recursive(Node *cur, NodeMa…

WPF的启动项

最近需要给软件加上登陆界面&#xff0c;所以需要修改WPF的APP 首先&#xff0c;在APP.xaml.cs中写界面的启动程序&#xff1a; public partial class App : Application{protected override void OnStartup(StartupEventArgs e){Application.Current.ShutdownMode System.Win…

好玩的获取目录信息的例子[C#]

DirectoryInfo dirinfo new DirectoryInfo("d:\\111");DirectoryInfo[] dirs dirinfo.GetDirectories();在Windows2003 下面跑, 如果创建.. 的目录 md 123..\实际获取的Name 是 123. 扩展 .而在Windows2012 下面跑, 得到的Name 是 123 . . 扩展 .所以 代码…

.NET通过async/await实现并行

如果可以并行可以大大提高性能&#xff0c;但在我们的使用中&#xff0c;不可能全是并行的也是要有线行操作&#xff0c;所以我们需要在业务逻辑层进行并行操作的护展&#xff1a; 数据访问层不变还是以前一样如下&#xff1a; public class UserDAL{public User GetUser(){Use…

HashMap夺命连环问

1、说说HashMap的结构 在JDK7时&#xff0c;采用数组链表结构 在JDK8时&#xff0c;采用数组链表红黑树的结构&#xff0c;在一定条件下&#xff0c;链表会转化为红黑树。 以上图来源于&#xff1a;https://blog.csdn.net/goosson/article/details/81029729 2、数组和链表的用…

【leetcode.191】位1的个数

本文转载自https://leetcode-cn.com/problems/number-of-1-bits/solution/wei-1de-ge-shu-by-leetcode/ 一、题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为汉明重量&#xff09;。 示例…

代码审计--17--修复方案汇总(上)

一、ESAPI使用 OWASP ESAPI (OWASP企业级安全API)是一个自由开源的web程序安全控制库,它可以让程序员利用此安全API规避很多安全风险。目前已经发布的有java版本及其他语言如C、C++、.Net、PHP等,ESAPI对常见安全漏洞提供了对应的安全控制实现方法。如下表: OWASP Top 10…

应聘.net开发工程师常见的面试题(二)(转载)

1.公司要求开发一个继承System.Windows.Forms.ListView类的组件&#xff0c;要求达到以下的特殊功能&#xff1a;点击ListView各列列头时&#xff0c;能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识&#xff0c;请简要谈一下您的思路 答…