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

无重复字符的最长字串

.

题目链接

无重复字符的最长字串

题目详情

算法原理

题目解析

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

题目要求子串中不能有重复的字符,因此,我们可以利用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;
    }
}
相关推荐
ysa0510305 分钟前
【板子】欧拉序
c++·笔记·算法·深度优先·图论
大耳朵糊涂9 分钟前
链表的基础操作(二)
算法
拂拉氏14 分钟前
【知识讲解】 红黑树的删除讲解
数据结构·算法·红黑树
初学者,亦行者14 分钟前
算法设计与分析:动态规划 - TSP问题和0-1背包问题
c++·算法·动态规划
ward RINL29 分钟前
# GPT-5.6-sol vs GPT-5.5 新题实测:非弹性碰撞物理题和稳定路由算法
网络·gpt·算法
灯澜忆梦30 分钟前
【dp_1】爬楼梯 | 斐波那契数 | 第 N 个泰波那契数 | 三步问题
算法·golang
星释1 小时前
鸿蒙智能体开发实战:35.鸿蒙壁纸大师 - 调用火山引擎模型生成壁纸
算法·华为·ai·harmonyos·鸿蒙·火山引擎
geovindu1 小时前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
db_murphy1 小时前
机器学习决策树的基尼系数是个啥?
学习·算法