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

系列文章目录

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

题目

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

环境

软件 版本
JDK 1.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)。

扩展

滑动窗口技巧

总结

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

随缘求赞

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

拜拜

猜你喜欢

转载自blog.csdn.net/u013084266/article/details/112995309
今日推荐