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. TDD: 解除依赖

    1  A类依赖B 类,可以把B类提取成IB接口,解除AB 之间的依赖关系. 通过创建实现了IB接口的BStub 装代码,可以模拟B类进行测试. 这是针对接口编程的典型.适合构造代价大,变化多的情况.应 ...

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

    1.1图形系统 计算机中描述图形信息的两大系统是栅格系统(raster graphics)和矢量图形(vector graphics) 1.1.4矢量图形的用途 ①计算机辅助绘图(CAD)程序. ②设 ...

  3. SpringBoot非官方教程 | 第十九篇: 验证表单信息

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot19/ 本文出自方志朋的博客 这篇文篇主要简述如何 ...

  4. Django-rest-framework(八)使用技巧(持续补充中)

    当viewset中,多个action对应了不同的serializers的时候 class UserView(viewsets.GenericViewSet): queryset = User.obje ...

  5. 数据恢复顾问(DRA)

    (1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文件和(某些环境下)控制文件的损坏,它不提供spfile和logfile的修复 ...

  6. Redis4.0新特性

    redis 4.0 新特性 Redis 4.0在2017年7月发布为GA.包含几个重大改进:更好的复制(PSYNC2),线程DEL / FLUSH,混合RDB + AOF格式,活动内存碎片整理,内存使 ...

  7. httpd的prefork、worker、event

    Apache(httpd) 有3种核心MPM(Multi-Processing Module,多进程处理模块)工作模式,分别是prefork,worker和event,其中httpd-2.2的even ...

  8. ASP.NET成员资格和角色管理

    一.成员资格管理 1.成员资格管理模型 ASP.NET提供的成员资格管理功能,其核心是利用内置的成员库表(SQL Server).成员资格管理API(Membership.MembershipUser ...

  9. JS日期去杠,日期转换String转Date

    1.巧妙使用split()和join()替换字符串var str = '2014-05-05';var newstr = str.split('-').join("");split ...

  10. 【linux基于Postfix和Dovecot邮件系统的搭建】

    一:PostFixe和Dovecot的简单介绍 Postfix postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Ven ...