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

无重复字符的最长字串

.

题目链接

无重复字符的最长字串

题目详情

算法原理

题目解析

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

题目要求子串中不能有重复的字符,因此,我们可以利用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;
    }
}
相关推荐
阿豪学编程5 小时前
LeetCode724.:寻找数组的中心下标
算法·leetcode
墨韵流芳5 小时前
CCF-CSP第41次认证第三题——进程通信
c++·人工智能·算法·机器学习·csp·ccf
csdn_aspnet6 小时前
C# 求n边凸多边形的对角线数量(Find number of diagonals in n sided convex polygon)
开发语言·算法·c#
禹中一只鱼6 小时前
【力扣热题100学习笔记】 - 哈希
java·学习·leetcode·哈希算法
凌波粒6 小时前
LeetCode--349.两个数组的交集(哈希表)
java·算法·leetcode·散列表
paeamecium7 小时前
【PAT甲级真题】- Student List for Course (25)
数据结构·c++·算法·list·pat考试
Book思议-7 小时前
【数据结构】栈与队列全方位对比 + C 语言完整实现
c语言·数据结构·算法··队列
SteveSenna7 小时前
项目:Trossen Arm MuJoCo
人工智能·学习·算法
NAGNIP8 小时前
一文搞懂CNN经典架构-DenseNet!
算法·面试
道法自然|~8 小时前
BugCTF黄道十二宫
算法·密码学