算法刷题:无重复字符的最长字串

无重复字符的最长字串

.

题目链接

无重复字符的最长字串

题目详情

算法原理

题目解析

首先,为了使字符串遍历的更加方便,我们选择将字符串转换为数组

题目要求子串中不能有重复的字符,因此,我们可以利用hash表来校验是否重复,这里我们采用数组来模拟hash表

滑动窗口

者道题我们使用的是滑动窗口的思想,大致逻辑如图

定义指针

因为窗口需要两个指针来维护窗口的边界,且两个指针都需要对数组进行从左往右的遍历操作,因此,我们定义left和right两个指针,初始值都为0

进窗口

这里的进窗口操作,可以理解为将hash表中的值进行+1操作

判断

这里的判断,主要是校验刚刚进行hash表+1操作之后的值,如果>1,说明hash表中出现了重复的字符,即不满足条件,需要出窗口

出窗口

这里的出窗口操作,就是将hash表中的left值除去,并将left往后移动一位.

完成操作之后,继续进行判断,如果已经没有重复的字符,就进行进窗口操做,直到right到达数组边界

更新结果

这里需要注意,题目要求无重复字符的最长字串,因此需要记录一下,hash表中的数据处于合法状态的时候,最长字串的长度

我的答案

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String ss) {
        //将字符串转换为数组
        char[] s = ss.toCharArray();
        //利用数组模拟哈希表
        int [] hash = new int [128];
        //定义指针
        int left = 0,right = 0,n=s.length,ret = 0;
        while(right<n){
            //进窗口(right加入hash表))
            hash[s[right]]++;
            //判断hash表中是否有与当前right重复的数
            while(hash[s[right]]>1){
                //不满足条件,出窗口(left移除hash表),直到将与right重复的数被移除
                hash[s[left++]]--;
            }
            //当前hash表合法,可以更新结果
            ret = Math.max(ret,right-left+1);
            //为下一次进窗口做准备
            right++;
        }
        return ret;
    }
}
相关推荐
mvufi几秒前
day31 第八章 贪心算法 part05
算法·贪心算法
珊瑚里的鱼29 分钟前
第一讲 | 算法复杂度
c语言·开发语言·数据结构·笔记·算法·visualstudio·visual studio
啊阿狸不会拉杆1 小时前
人工智能数学基础(四):线性代数
人工智能·python·数学·算法·机器学习
玖剹1 小时前
矩阵区域和 --- 前缀和
数据结构·c++·算法·leetcode·矩阵·动态规划·1024程序员节
zwz宝宝1 小时前
第三次作业(密码学)
java·数据结构·算法
sxtyjty2 小时前
tarjan缩点+强联通分量
算法
freyazzr2 小时前
Leetcode刷题 | Day50_图论02_岛屿问题01_dfs两种方法+bfs一种方法
数据结构·c++·算法·leetcode·深度优先·图论·广度优先
我想进大厂2 小时前
图论---LCA(倍增法)
数据结构·c++·算法·图论
明月看潮生2 小时前
青少年编程与数学 02-018 C++数据结构与算法 16课题、贪心算法
c++·算法·青少年编程·贪心算法·编程与数学
机器学习之心2 小时前
飞蛾扑火算法优化+Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型)
算法·回归·lstm·transformer·飞蛾扑火算法优化