博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]3. Longest Substring Without Repeating Characters无重复字符的最长子串
阅读量:6916 次
发布时间:2019-06-27

本文共 2174 字,大约阅读时间需要 7 分钟。

Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"

Output: 3
Explanation: The answer is "abc", with the length of 3.

Example 2:

Input: "bbbbb"

Output: 1
Explanation: The answer is "b", with the length of 1.

Example 3:

Input: "pwwkew"

Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

题目要求一个最长的无重复的子串(子串要求连续),我们可以想到使用set来操作,set可以保证内部元素全部是无重复的,这比我们使用暴力方法去遍历判断重复要优化很多。简单来说就是遍历一次字符串,用i和j来标记子串的开始和结束。每次遇到不同的就把元素加入到set中,同时子串长度+1,遇到相同的就从当前子串的开头开始删除,一直删除到重复元素的位置,比如说从i开始的第n个元素重复了,就删除掉从i到n的所有元素,这样新的不重复子串就是string[i+n+1,j+1],再和旧的长度比较出最大的,如此重复直到字符串末尾。

由于很像网络流量控制的滑动窗口协议,所以这种方法也叫滑动窗口

class Solution {    public int lengthOfLongestSubstring(String s) {        int n=s.length(),max=0;        int i=0,j=0;        HashSet
set=new HashSet
(); while(i

还可以从空间角度进行优化

当我们知道该字符集比较小的时侯,我们可以用一个整数数组作为直接访问表来替换 Map。

常用的表如下所示:

int [26] 用于字母 ‘a’ - ‘z’或 ‘A’ - ‘Z’int [128] 用于ASCII码int [256] 用于扩展ASCII码
public class Solution {    public int lengthOfLongestSubstring(String s) {        int n = s.length(), ans = 0;        int[] index = new int[128]; // current index of character        // try to extend the range [i, j]        for (int j = 0, i = 0; j < n; j++) {            i = Math.max(index[s.charAt(j)], i);            ans = Math.max(ans, j - i + 1);            index[s.charAt(j)] = j + 1;        }        return ans;    }}

python的话可以使用列表自带的切片来维护一个不重复集合set

class Solution:    def lengthOfLongestSubstring(self, s):        """        :type s: str        :rtype: int        """        max_number = 0        number = 0        test = ''        for i in s:            if i not in test:                test += i                number += 1            else:                if number >= max_number:                    max_number = number                index = test.index(i)                test = test[(index+1):] + i                number = len(test)        if number > max_number:            max_number = number        return max_number

 

转载于:https://www.cnblogs.com/jchen104/p/10190662.html

你可能感兴趣的文章
再比较动态调用代码
查看>>
从客户端(&)中检测到有潜在危险的 Request.Path 值
查看>>
TextView的属性详解
查看>>
[转载]《编程之美: 求二叉树中节点的最大距离》的另一个解法
查看>>
使用python写的如何自动提交和抓取网页
查看>>
计算机语言三大趋势,读书笔记方便记忆。
查看>>
【读书笔记《Bootstrap 实战》】4.企业网站
查看>>
初学HTC
查看>>
SQL Server 开发指南
查看>>
JCheckBox使用示例
查看>>
OEA 框架中集成的 RDLC 报表介绍
查看>>
[铁道部信息化管理]12306的已知信息、数据及问题
查看>>
web前端开发分享-css,js深化篇
查看>>
在CentOS下安装tomcat并配置环境变量(改默认端口8080为8081)
查看>>
AgileEAS.NET平台开发案例-药店系统-需求分析
查看>>
[Android] adb 命令 dumpsys activity , 用来看 task 中的activity。 (uninstall virus)
查看>>
MyBatis简单使用和入门理解
查看>>
图片移动效果
查看>>
基于Web的Kafka管理器工具之Kafka-manager安装之后第一次进入web UI的初步配置(图文详解)...
查看>>
C# Winform反序列化复杂json字符串
查看>>