剑指 Offer 48. 最长不含重复字符的子字符串

这篇博客介绍了如何利用动态规划算法解决寻找字符串中最长不重复字符子串的问题。通过维护一个哈希映射来记录字符的最新位置,并计算以每个字符结尾的最长不重复子串长度,最终得到最大长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

剑指 Offer 48. 最长不含重复字符的子字符串 - 力扣(LeetCode) (leetcode-cn.com)

思路:动态规划,用map存储字符在字符串中最后一次出现的位置,假设以当前字符为结尾的字符串的最长不重复串的长度为dp[i],如果s[i]没在map里出现过,说明该字符前面没有出现过该字符,那么dp[i]=dp[i-1]+1;如果s[i]在map里有出现过,对应的下标为j,如果i-j>dp[i-1],说明在以当前字符为结尾的字符串的最长不重复串仍然没有重复,此时dp[i]=dp[i-1]+1;如果i-j<=dp[i-1],说明出现了重复字符,dp[i] = i - j.

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s == null || s.length() == 0){
            return 0;
        }
        int len = s.length();
        int[] dp = new int[len];
        dp[0] = 1;
        Map<Character, Integer> map = new HashMap();
        map.put(s.charAt(0), 0);
        int max = 1;
        char c;
        int index = 0;
        
        for(int i = 1; i < len; i++ ){
            c = s.charAt(i);
            index = map.getOrDefault(c,-1);
            if(dp[i - 1] >= i - index){
                dp[i] = i - index;
            }else{
                dp[i] = dp[i - 1] + 1;
            }
            if(dp[i] > max){
                max = dp[i];
            }
            map.put(c,i);
        }
        return max;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值