无重复最长字符串(最长无重复子字符串),剑指offer,力扣

目录

原题:

力扣地址:

我们直接看题解吧:

解题方法:

难度分析:

难度算中下吧,这个总体不算很难,而且滑动窗口,以及哈希都比较常见

审题目+事例+提示:

解题思路(滑动窗口+哈希):

代码实现:


原题:

1.题目:最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中值包含‘a’-‘z’的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4。

力扣地址:

LCR 167. 招式拆解 I - 力扣(LeetCode)

难度:中等

今天刷无重复最长字符串(最长无重复子字符串),大家有兴趣可以点上看看题目要求,试着做一下。

我们直接看题解吧:

解题方法:

这道题比较明显的看出适合用滑动窗口(双指针)题目,同时+哈希表(效率更高)

难度分析:

难度算中下吧,这个总体不算很难,而且滑动窗口,以及哈希都比较常见

审题目+事例+提示:

解题思路(滑动窗口+哈希):

1、定义双指针f=0,s=-1,从字符串的同一侧出发进行遍历

2、f首先遍历:

    ·若与前面无重复,则放入哈希表,更新最长字符串长度,接着遍历下一位

   · 若当前出现与之前的字符重复,则f访问下一位,s访问前面重复字符的下一位

   ·重复上述过程。

3、返回对应的字符串长度

代码实现:

class Solution {
    public int dismantlingAction(String arr) {
           //创建哈希表,key装字符元素,value装对应的下标
        Map<Character, Integer> dic = new HashMap<>();
         //res装相应字符串最大长度
        int s = -1, res = 0, len = arr.length();
        for(int f = 0; f < len; f++) {
            if (dic.containsKey(arr.charAt(j)))
                //更新s,比较下标大小,比的是 当前重复元素第一次出现的下标与
                                         //之前的另一重复元素第一次出现的下标
                s = Math.max(s, dic.get(arr.charAt(f))); // 更新左指针 s
            // 当存在重复时更新重复元素哈希表记录的下标,当无重复时放入无重复元素及下标
            dic.put(arr.charAt(f), f);
            res = Math.max(res, f - s); // 更新最长字符串长度结果
        }
        return res;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值