LeetCode 热题 HOT 100(02,无重复字符的最长子串)

6 篇文章 0 订阅
5 篇文章 0 订阅

LeetCode 热题 HOT 100(02,无重复字符的最长子串)

不够优秀,发量尚多,千锤百炼,方可成佛。

算法的重要性不言而喻,无论你是研究者,还是最近比较火热的IT 打工人,都理应需要一定的算法能力,这也是面试的必备环节,算法功底的展示往往能让面试官眼前一亮,这也是在大多数竞争者中脱颖而出的重要影响因素。

然而往往大多数人比较注重自身的实操能力,着重于对功能的实现,却忽视了对算法能力的提高。有的时候采用不同的算法来解决同一个问题,运行效率相差还是挺大的,毕竟我们最终还是需要站在客户的角度思考问题嘛,能给用户带来更加极致的体验当然再好不过了。

万法皆空,因果不空。Taoye之前也不怎么情愿花费太多的时间放在算法上,算法功底也是相当的薄弱。这不,进入到了一个新的学习阶段,面对导师的各种“严刑拷打”和与身边人的对比,才开始意识到自己“菜”的事实。

讲到这,我的眼角又湿了!!!

这次的题目是LeeTCode 热题 HOT 100的第三题,难度属于中等,感觉比第二题稍微简单点。

下面,我们就来看看这道题吧。

题目:无重复字符的最长子串

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

题目Url:https://leetcode.com/problems/longest-substring-without-repeating-characters/

示例

  • 示例1

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

  • 示例2

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

  • 示例3

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路

根据题目的要求,我们需要输出无重复字符的最长子串长度,我们不妨用result来代替。

由于需要记录输入字符串的每个字符在之前遍历的子串中是否重复,所以我们需要一个容器对已经遍历过的字符进行临时存储。

进过分析,我们可以发现,临时容器存储的数据主要有两个,一个是字符值,还有一个就是字符在输入字符串中的索引值,且这两个属性有个一一映射关系。所以我们不难得到,可以通过创建一个HashTable来代替该容器,在Python中,则可以使用dict字典来表示。(与HOT 100第一题意思类似)我们不妨将该临时字典容器用temp_dict来表示。

此外,在对输入字符串进行遍历的过程中,还需要用到一个临时索引,主要用来记录与遍历当前字符值相同的上一个字符的索引,比如:示例1中输入字符串为“abcabcbb”,当我们遍历到索引为3的时候,此时字符为a,而上一个字符a的索引为0。所以,当我们遍历到的字符在temp_dict中出现过时,则需要更改与该字符相同的上一个字符的索引,也就是由初始值-1更改为0。我们不妨将这个临时索引用temp_index来表示

至此,我们得到的完整算法如下(推敲算法流程和下面代码的实现):

  • 初始化三个变量:result, temp_dict, temp_index = 0, dict(), -1,目标返回值result和temp_dict初始为0和dict()不用解释,而temp_index之所以初始为-1,主要是因为我们返回新的result的时候,需要与之前的result和遍历至此时候的最大长度进行比较,取二者的最大值。
  • 对输入的字符串进行遍历,判断如果当前遍历字符在temp_dict中,且该字符上次出现的索引大于当前更新前的temp_index临时索引,则需要更新临时索引temp_index和临时字典temp_dict。否则将首次出现的字符添加到临时字典temp_index中,并更新result的值。
  • 遍历完输入的字符串之后,返回result

该算法的Python实现:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        result, temp_dict, temp_index = 0, dict(), -1   # 定义初始变量
        for index, value in enumerate(s):               # 对输入字符串s进行循环遍历
            if value in temp_dict and temp_dict[value] > temp_index:    # 判断temp_dict是更新还是添加
                temp_index, temp_dict[value] = temp_dict[value], index  # 更新temp_dcit和temp_index
            # 添加temp_dict,并修改result
            else: temp_dict[value], result = index, max(result, index - temp_index) 
        return result       # 遍历完成返回目标结果

该算法的C++实现(实现思想同Python):

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int result = 0, temp_index = -1;
        unordered_map<char, int> temp_dict;
        for (int index = 0index < s.size(); index++) {
            if (temp_dict.count(s[index]) != 0) {
                if (temp_dict[s[index]] > temp_index) {
                    temp_index = temp_dict[s[index]];
                    temp_dict[s[index]] = index;
                }
            }else {
                temp_dict[s[index]] = index;
                result = result > (index - temp_index) ? result : (index - temp_index);
            }
        }
        return result;
    }
};

另外,官方给出了一种滑动窗口的方式实现,主要是找出从每一个字符开始,不包含重复字符的最长子串。

滑动窗口的主要核心思想可以参考官方,或者下面三篇讲解的思路,感觉讲的很不错:

  1. 《LeetCode第三题:解题思路》: https://blog.csdn.net/boling_cavalry/article/details/86563586
  2. 《LeetCode第三题:编码实现》:https://blog.csdn.net/boling_cavalry/article/details/86654969
  3. 《LeetCode第三题:两次优化》:https://blog.csdn.net/boling_cavalry/article/details/86655675

推荐阅读:

LeetCode 热题 HOT 100(00,两数之和)
LeetCode 热题 HOT 100(01,两数相加)
Taoye渗透到一家黑平台总部,背后的真相细思极恐
《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?
那些年,我们玩过的Git,真香
基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境
网络爬虫之页面花式解析
手握手带你了解Docker容器技术
一文详解Hexo+Github小白建站
​打开ElasticSearch、kibana、logstash的正确方式

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值