3789. 隐藏字符串(dp)

题目链接

题意:

给定一个由小写字母构成的字符串 s。

我们称字符串 t 隐藏于字符串 s 中,如果它满足:

  • 存在一个字符串 ss 的子序列,与其一一对应。
  • 该子序列的各个元素的下标可以构成一个等差序列。

例如,字符串 aab 就隐藏于字符串 aaabb 中,因为 aaabb 的第 1,3,5 个元素刚好可以构成 aab,而这恰好是一个公差为 2 的等差数列。

字符串 tt 可能隐藏于字符串 s 中多次,这取决于共有多少个 s 的不同子序列满足与字符串 t 一一对应,且各个元素下标可以构成一个等差数列。

例如,在字符串 aaabb 中,a 隐藏了 3 次,b 隐藏了 2 次,ab 隐藏了 6 次…

现在,请你求出字符串 ss 中,隐藏次数最多的字符串一共隐藏了多少次?

思路:

某一个大于2的序列出现的次数一定和它前两个字母出现的次数相等,所以我们只需要计算两个字母出现的次数或者单个字母出现的次数即可。即记录f[i][j],第一个字母为i,第二个字母为j出现的次数。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll s[30],f[30][30];
char str[100010];
int main(){
    scanf("%s",str);
    ll res=0;
    for(int i=0;str[i];i++){
        int t=str[i]-'a';
        for(int j=0;j<26;j++){
            f[j][t]+=s[j];
            res=max(f[j][t],res);//j-k出现的次数
        }
        s[t]++;
        res=max(s[t],res);//单个字母出现的次数
    }
    printf("%lld\n",res);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值