【动态规划】最长不含重复字符的子字符串

力扣dp题

在这里插入图片描述

思路

已知字符串S,求其最长的不含重复字符的子串,最优解问题想到动态规划

  • dp[ j ] 记录以 s[ j ] 字符为结尾的最长不含重复字符子串的长度。
  • s[i] 为在 s[j] 左边出现的距离最近的相同字符 (i<j)
  • 当我们遍历计算 dpdp[j] 时,如果 s[j] 左边没有与之相同的字符 s[i] ,则 dp[j]=dp[j-1]+1 ;
  • 如果 s[j] 左边有 s[i] 与之相同,则需要判断前一个状态 dp[j-1] 的字符串长度与i的位置关系:
    • dp[j-1]<j-i ,说明 s[i 在 dp[j-1] 所表示的子串之外,对 dp[j] 结果不造成影响,此时 dp[j]=dp[j-1]+1
    • dp[j-1]>=j-i ,说明 s[i] 正好落在了 dp[j-1] 所表示的子串内,此时 dp[j] 的值应更新为 s[i]s[j] 之间的长度,即 dp[j]=j-i ;
题解代码+超级详细注释
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size();
        if(n==0)return 0;//空字符串判断
        vector<int> dp(n,0);//dp[j]用来表示以s[j]为结尾的最长不含重复字符的子字符串的长度
        dp[0]=1;//初始化,单字节字符串一定无重复
        for(int j=1;j<n;++j){
            dp[j]=dp[j-1]+1;//在左边没有与s[j]重复字符的情况下,dp[j]=dp[j-1]+1;
            for(int i=j-1;i>=0;--i){//从j-1位置开始,自右向左遍历查看是否有重复字符
                if(s[i]==s[j]&&dp[j-1]>=j-i){
                    dp[j]=j-i;//当相同字符s[i]的位置处于dp[j-1]的长度范围内,则dp[j]的值应更新为j-i,如果在dp[j-1]的长度之外,则对dp[j]无影响
                    break;//找到距离最近的重复字符,判断完毕后就应立即跳出循环
                }
            }
        }
        sort(dp.begin(),dp.end());
        return dp[n-1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

启立家的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值