算法学习系列:无重复字符的最长子串

系列文章目录

算法学习系列:无重复字符的最长子串

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
具体题目信息为:3. 无重复字符的最长子串

环境

软件版本
JDK1.8

正文

一、算法思想

使用滑动窗口算法即可解决该问题。该算法可以用来解决以下两种类型的问题:

  1. 可以解决数组/字符串的子元素问题;
  2. 可以将嵌套的for循环问题,转换为单循环问题,降低时间复杂度

二、算法数据结构

根据问题具体分析使用。本篇博文涉及的题目主要使用哈希表。

三、算法思路

  1. 定义左右指针的起始位置为0,maxLen为0;
  2. 先不断移动右指针,当窗口不满足要求,即是存在重复字符的时候,就停止移动右指针;
  3. 移动左指针,等窗口满足要求,即是为无重复字符的字符串,并更新minLen;
  4. 重复第2、3步至结尾

四、解决代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0;
        char[]  list = s.toCharArray();
        Map<Integer, Integer> windows = new HashMap<>();
        int left = 0,right = 0;
        int len = 0;
        while (right < list.length) {
            int t = list[right];
            windows.put(t, windows.getOrDefault(t,0)+1);
            right ++;
            while (windows.get(t)>1) {
                int l = list[left];
                windows.put(l, windows.get(l) - 1);
                left ++;
            }
            len = right - left;
            if (max < len) {
                max = len;
            }
        }
        if (max < len) {
            max = len;
        }
        return max;
    }
}

五、效率分析

1. 空间复杂度分析

需要使用哈希表进行存储,所以空间复杂度为 O(n)

2. 时间复杂度分析

因为只是对字符串进行遍历计算,所以时间复杂度为 O(n)。

扩展

滑动窗口技巧

总结

多做做算法题,研究一下算法,对自身素养的提升是有很有帮助的!!!

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!
在这里插入图片描述

拜拜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫夜求索阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值