算法日常・每日刷题--<动态规划>26

467. 环绕字符串中唯一的子字符串 - 力扣(LeetCode)

题目描述

把字符串 s 看作无限环绕字符串 "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd...." 的一部分。 现在给定字符串s,求s中有多少个唯一的非空子串,这个子串在环绕串中出现。

示例: 输入: s = "zab" 输出: 6 解释:有 6 个唯一子串:z、a、b、za、ab、zab

思路分析

核心观察

  1. 合法子串必须是连续递增:a→b→c...z→a。
  2. 同一个结尾字母 ,我们只需要保留最长连续子串的长度。

举例:以b结尾,最长连续长度是 3,那么它能贡献 3 个子串:b、ab、zab;短的可以直接忽略,避免重复统计。

状态定义

dp[i]:以 s i 结尾的最长连续环绕子串的长度

  • 初始化:dp[i]=1,单个字符自身长度为 1
  • 转移条件: 如果 s[i-1]+1 == s[i] 或者 s[i-1]=='z' && s[i]=='a',说明连续,dp[i] = dp[i-1] + 1 否则,dp[i] 保持 1,断开。

去重关键(本题精华)

开数组ch[26],ch[c-'a']保存以字符 c 结尾的最长连续子串长度。

为什么取最大值? 比如s="abab",两个b,第一个 b 的 dp=2,第二个 b 的 dp=2。以 b 结尾最长就是 2,只贡献 2 个子串,防止重复计数。

最后把 ch 数组 26 个值全部累加,就是答案。

【去重例子】s = "abcdxyzabcd"

现在来了两段 abcd,abcd + xyzabcd s = a b c d x y z a b c d

先看两段 d: 第一段末尾 d,dp=4; 第二段末尾 d,dp 算出来是 7。 ch d = max (4,7) → 取 7!

第一段 d 产生的子串:d、cd、bcd、abcd 第二段更长的以 d 结尾串,包含上面全部,还新增更多子串。 旧的那一组完全重复,所以直接丢弃旧的 4,保留最大值 7。

ch a:第一次 a dp=1;后面第二个 a dp=4 → ch a=max (1,4)=4 ch b:第一次 b dp=2;后面第二个 b dp=5 → ch b=max (2,5)=5

cpp 复制代码
class Solution {
public:
    int findSubstringInWraproundString(string s) {
        int n = s.size();
        vector<int> dp(n,1);
        int ch[26]={0};
        int ret = 0;
        for (int i = 1; i < n; i++) {
            if (s[i - 1] + 1 == s[i] || (s[i - 1] == 'z' && s[i] == 'a')) {
                dp[i] += dp[i - 1];
               
            } 
            
        }
        for(int i=0;i<n;i++)
        {
             ch[s[i]-'a']=max(dp[i],ch[s[i]-'a']);
        }
        for (auto e : ch)
            ret+=e;
        return ret;
    }
};
相关推荐
专注仿真8 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练
FII工业富联科技服务8 小时前
多智能体如何进入制造现场?从业务协同到数字孪生验证
大数据·人工智能·算法·机器人·制造·数字孪生
≮傷£≯√8 小时前
httpserver_QNetWorkClient
算法
Evand J9 小时前
【PMSM例程11】永磁同步电机(PMSM)基于UKF的转速与转子位置估计。附下载链接
算法·matlab·卡尔曼滤波·永磁同步电机·ukf·pmsm·位置估计
货拉拉技术9 小时前
记忆即智能:重构对话式AI Agent认知基座的四层渐进式记忆与自进化系统
人工智能·算法
杜 硕9 小时前
从零开始的C++生活——第六讲——02
c++·算法·生活
小超人诞生日记9 小时前
C++ STL 反向迭代器:从源码框架到适配器实现
c++·算法
青少儿编程课堂9 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园成语接龙大挑战解析
c++·python·算法·bfs·信息学竞赛
老师我太想进步了202610 小时前
【数据结构-1】例解算法复杂度
数据结构·算法
tyler_download10 小时前
deepseek后训练算法:位置编码算法RoPE详解1
算法