leetcode算法题--环绕字符串中唯一的子字符串★

原题链接:https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/

思路是dp数组保存以26个字母为结尾的子字符串的最长长度,之后将所有数组累加起来即可。举个例子,对于zab就有dp[z]=1,dp[a]=2,dp[b]=3,dp[z]中是z,dp[a]中是a,za,dp[b]中是zab,ab,b,加起来为6就是正确答案,这里我们用map来作为dp数组。

map[key]=value,key就是26个字母,value就是表示以key为结尾的子字符串最长长度

状态转移

map[i]=max(map[i],count) count就是以i为结尾的子字符串的长度,使用max取最长的

代码:

 int findSubstringInWraproundString(string p) {
     int len=p.size();
     if(len==0) return 0;
     map<char,int> map;
     int count=1;
     map[p[0]]=count;
     for(int i=1;i<len;i++){
         if(p[i]-p[i-1]==1||p[i-1]=='z'&&p[i]=='a'){
             count++;
         }else{
             count=1;
         }
         map[p[i]]=max(map[p[i]],count);
     }
     int sum=0;
     for(auto iter=map.begin();iter!=map.end();iter++){
         sum+=iter->second;
     }
     return sum;
 }

如果题目中与26个字母都有关,把字母作为动态规划的索引是非常好的方式,并且需要找到好的状态转移!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值