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

无重复字符的最长字串

.

题目链接

无重复字符的最长字串

题目详情

算法原理

题目解析

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

题目要求子串中不能有重复的字符,因此,我们可以利用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;
    }
}
相关推荐
2601_962218617 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
吞下星星的少年·-·7 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
stolentime8 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
和裕10 小时前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
衡石科技10 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
shirsl11 小时前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
土司大王12 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
2601_9622186112 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
那年窗外下的雪.13 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法