LeetCode 3——无重复字符的最长子串
1. 题目
2. 解答
2.1. 方法一
我们从前往后遍历字符串,start 代表最长子串的起始位置,一开始设置为零。
如果没有遇到重复字符,则更新子串的长度,向后遍历。
如果遇到重复字符时,则更新字符串起始位置为上一个相同字符的后面一个位置,同时更新子串长度。
重复上面这个过程,直到遍历完毕。
'abcabc',start = 0,str_len = 1, 2, 3
此时第二次遇到 'a',start = 1,str_len = 3
此时第二次遇到 'b',start = 2,str_len = 3
此时第二次遇到 'c',start = 3,str_len = 3
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max_len = 0
str_len = 0
start = 0 # 最长子串的起始位置
index = 0 # 上一个相同字符在子串中的位置,是一个相对位置,不是在原字符串中的位置
for i in range(len(s)):
if (s[i] not in s[start:i]):
str_len += 1
# 如果遇到重复字符,更新子串的起始位置为上一个相同字符的后面一个位置
# 同时我们需要更新子串长度
else:
max_len = max(max_len, str_len)
index = s[start:i].find(s[i])
str_len = str_len - index
start = start + index + 1
max_len = max(max_len, str_len) # 一直没有遇到重复字符
return max_len
2.2. 方法二
方法一中,我们每次判断当前字符是否为重复字符时,都需要在子串中进行搜索,更新子串起始位置时,也要在子串中搜索上一个相同字符的位置,效率很低。
其实我们需要知道的就是一个子串的起始位置,然后往后遍历的时候只需要在适当的时候更新这个起始位置重新计算子串长度即可。
因此,我们可以建立一个当前字符和当前字符下一个位置的映射。
所有映射全部初始化为零,start = 0。从前往后开始遍历字符串,同时更新映射,计算子串长度。
如果当前字符的映射大于 start,说明在 satrt 后面出现过当前字符,就更新 start。
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max_len = 0
str_len = 0
start = 0 # 最长子串的起始位置
index = 0 # 重复的字符在子串中的位置
# 初始化映射
table = []
for i in range(128):
table.append(0)
for i in range(len(s)):
start = max(start, table[ord(s[i])])
str_len = i - start + 1
max_len = max(max_len, str_len)
table[ord(s[i])] = i + 1
return max_len
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int table[128] = {0}; // 自动初始化为零
int max_len = 0;
int str_len = 0;
int start = 0;
string::iterator it = s.begin();
for (int j = 0; it != s.end(); it++, j++)
{
start = start > table[*it] ? start : table[*it];
table[*it] = j + 1;
str_len = j - start + 1;
max_len = max_len < str_len ? str_len : max_len;
}
return max_len;
}
};
获取更多精彩,请关注「seniusen」!
LeetCode 3——无重复字符的最长子串的更多相关文章
- Leetcode(三)无重复字符的最长子串
3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...
- [LeetCode] 3. 无重复字符的最长子串
题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...
- 【leetcode 3. 无重复字符的最长子串】解题报告
思路:滑动窗口的思想 方法一:滑动窗口 int lengthOfLongestSubstring(string s) { /* 控制一个滑动窗口,窗口内的字符都是不重复的,通过set可以做到判断字符是 ...
- LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...
- Leetcode——3. 无重复字符的最长子串
难度: 中等 题目 Given a string, find the length of the longest substring without repeating characters. 给定一 ...
- 力扣Leetcode 3. 无重复字符的最长子串
无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- [LeetCode]3. 无重复字符的最长子串(滑动窗口)
题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...
- [LeetCode]3.无重复字符的最长子串(Java)
原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...
- LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...
随机推荐
- Android学习笔记_13_网络通信之多个上传文件
一.获取HTTP协议: 建立一个Web项目,建立一个如下所示的jsp界面,用IE捕获表单提交信息. <%@ page language="java" contentType= ...
- 【题解】洛谷P2914[USACO08OCT]断电Power Failure
洛谷P2914:https://www.luogu.org/problemnew/show/P2914 哇 这题目在暑假培训的时候考到 当时用Floyed会T掉 看楼下都是用Dijkstra 难道没有 ...
- 消息中间件JMS(二)
之前介绍了ActiveMQ下载与安装,并且启动了.下面进行ActiveMQ的Demo 1. JMS入门Demo 1.1 点对点模式 点对点模式主要建立在一个队列上面,当连接一个队列的时候,发送端不需要 ...
- static函数
C语言中使用静态函数的好处: 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多. 关键字“static”,译成中文就是“静态 ...
- LeetCode11.盛最多水的容器 JavaScript
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- Redis-cluster详解
redis集群结构 特点: 1 所有redis节点(包括主和从)彼此互联(两两通信),底层使用内部的二进制传输协议,优化传输速度;(所有功能特点的基础) 2 集群中也有主从,也有高可用的 ...
- rabbitmq消息中间件读后感
1:RabbitMQ是一个开源的消息代理和队列服务器,可以通过基本协议在完全不同的应用之间共享数据,使用Erlang语言开发的,是基于AMQP(高级消息队列协议)协议,Erlang主要用于交换机的开发 ...
- 洛谷P3804 【模板】后缀自动机
题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用
DLL 文件编写方法: 1.建立DLL工程 2.声明.定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* prc ...
- wamp环境下安装imagick扩展
先上图,如下是安装成功后的phpinfo()界面: 安装步骤: 1.先确定安装版本,比如我的的php : php7.0.12 x86 ts 那么就需要三方版本 要一致:imagick软件本身( 如x ...