剑指 offer 面试题 48 最长不含重复字符的子字符串(滑动窗口)

最长不含重复字符的子字符串

个人博客


请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
题解
  • 滑动窗口(刚知道滑动窗口也是动态规划的一种)

    • 算法思想
      • 使用一个 map 记录字符串出现的位置
      • 使用 i、j 两个指针(记录下 i-j,如果大于最大值,则更新最大值),j 每前进一步就检查字符串中 j 位置的元素之前(记为 m)是否出现过,是否在 i-j 之间
      • 如果在 i-j 之间,则将 i 的位置前进至m。
      • 如果不在,则继续前进 j
      • 直到结束
    • 复杂度分析
      • 时间复杂度 O(n):j 指针前进 n 次
      • 空间复杂度 O(1):字符的 ASCII 码范围为 00 ~ 127127 ,哈希表 dicdic 最多使用 O(128) = O(1)O(128)=O(1) 大小的额外空间。
    class Solution {
        public int lengthOfLongestSubstring(String s) {
            HashMap<Character,Integer> map = new HashMap<>();
            int i = 0,res = 0,longest = 0;
            for(int j = 0;j < s.length();j++){
                int lastAppear = map.getOrDefault(s.charAt(j),-1);
                if(lastAppear != -1)i = lastAppear + 1;
                map.put(s.charAt(j),j);
                longest = longest < j - lastAppear ? longest + 1 : j - lastAppear;
                res = Math.max(res,longest);
            }
            return res;
        }
    }
    

    LN9CKY

  • 暴力解法

    • 算法思想
      • 列举出所有的子串,然后在比较字符串的大小
    • 复杂度分析
      • 时间复杂度 O(n^3):列举所有的字符串需要 n^2,比较所有子串的长度需要 n。
      • 空间复杂度 O(n^2)
    • 算法太渣,不能使用
总结
  • 遇到子串问题记得想想滑动窗口,想想双指针
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值