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——无重复字符的最长子串的更多相关文章

  1. Leetcode(三)无重复字符的最长子串

    3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  2. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...

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

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  4. 【leetcode 3. 无重复字符的最长子串】解题报告

    思路:滑动窗口的思想 方法一:滑动窗口 int lengthOfLongestSubstring(string s) { /* 控制一个滑动窗口,窗口内的字符都是不重复的,通过set可以做到判断字符是 ...

  5. LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...

  6. Leetcode——3. 无重复字符的最长子串

    难度: 中等 题目 Given a string, find the length of the longest substring without repeating characters. 给定一 ...

  7. 力扣Leetcode 3. 无重复字符的最长子串

    无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  8. [LeetCode]3. 无重复字符的最长子串(滑动窗口)

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  9. [LeetCode]3.无重复字符的最长子串(Java)

    原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...

  10. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

随机推荐

  1. 【题解】UVA756 Biorhythms (中国剩余定理)

    UVA756:https://www.luogu.org/problemnew/show/UVA756 思路 几乎是裸的中国剩余定理模板题 但是需要注意的是此题并不是求最小正整数解 而是求大于d的解 ...

  2. SQLite动态库下载

    其中带有“bundle”字样的表示动态库是按混合模式编译的,在 使用的时候只需要System.Data.SQLite.dll就可以了 而不带“bundle”的则是将非托管部分和托管部分分别编 译,Sy ...

  3. o'Reill的SVG精髓(第二版)学习笔记——第八章

    第八章:图案和渐变 要使用图案,首先要定义一个水平或者垂直方向重复的图形对象,然后用它填充另一个对象或者作为笔画使用.这个图形对象呗称作tile(瓷砖). 下面可以把SVG绘制的二次曲线作为图案. & ...

  4. Java集合框架之Set接口

     1.Set接口不记录元素添加顺序的误区 public  void setDemo(){        Set<String> set1 = new HashSet<>();  ...

  5. PL/SQL 用户自定义子类型

    子类型具有与其基本类型相同的操作,但只有基本类型有效值的子集. 例如,PL/SQL预先定义子类型CHARACTER和INTEGER,如下所示: SUBTYPE CHARACTER IS CHAR; S ...

  6. java面向对象编程思想的理解

    1.我们总说java是一门面向对象编程的语言,那什么是面向对象呢? 我是这样理解的,对象是事物存在的实体,如,猪.狗,花早等都是对象,对象由两部分组成.面向对象编程的三大特点:继承,多态,类是封装对象 ...

  7. iOS之一些实用的Demo

    图像浏览及处理 FLAnimatedImage - gif播放处理的工具. CLImageEditor - 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情. ios-image-f ...

  8. html5语义化标签——回顾

    html5 头部结构   <!doctype html>    <meta charset=“utf-8”/> <header></header> 页眉 ...

  9. ETO的公开赛T5《猎杀蓝色空间号》题解

    这道题别看题面这么长,其实题意很简单 就是让你求从起点开始的最长合法区间 合法的要求有两个:兜圈子和直飞 且这两个条件相互独立 (也就是说兜圈子的末尾不会对下面可能出现的直飞造成影响) 举个例子: 1 ...

  10. 【ospf-vlink虚拟连接】

    根据项目需求,搭建好如下拓扑图 配置rt1的环回 口地址及g0/0/0的ip地址 配置rt1的ospf 配置rt2的环回口地址和g0/0/1及g0/0/0的ip地址 \ 配置rt2的ospf 同理,配 ...