子序列个数 【动态规划问题】(Python C++ C)

学校考试的一道题,写了很久写不出来,后面才知道这就是动态规划的题,记录一下

题目大意:

给一个字符串,在里面寻找有多少个给定子序列(注意子序列与子串的不同)

子串:下标连续

子序列:下标可以不连续

常规思路大体如下,但是字符串序列长了就可能会运行超时

count=0
for i in range(len(str)):
    if str[i]=='J':
        for j in range(i+1,len(str)):
            if str[j]=='X':
                for k in range(j+1,len(str)):
                    if str[k]=='N':
                        for e in range9(k+1,len(str)):
                            if str[e]=='U':
                                count+=1

Python正确代码:

# Python
n = int(input())
str_n = input()
lst = [0, 0, 0, 0]  # 创建一个列表 lst,用于存储四个计数器
for i in range(n):
    if str_n[i] == 'J':  # 如果当前字符是'J',则将 lst[0] 计数器加1,表示找到了一个'J'
        lst[0] += 1
    elif str_n[i] == 'X':  # 如果当前字符是'X',则将 lst[1] 计数器加上之前记录的'J'的个数,表示每个'J'都可以与当前的'X'组成'JX'
        lst[1] += lst[0]
    elif str_n[i] == 'N':
        lst[2] += lst[1]
    elif str_n[i] == 'U':
        lst[3] += lst[2]
print(lst[3] % 1000000007)

C++代码:

#include <iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    char str[n+1];
    cin >> str;
    long long sum[4];
    sum[0] = sum[1] = sum[2] = sum[3] = 0;
    for(int i=0;i<n;i++){
        if(str[i]=='J') sum[0]++;
        else if(str[i]=='X') sum[1] += sum[0];
        else if(str[i]=='N') sum[2] += sum[1];
        else if(str[i]=='U') sum[3] += sum[2]; 
    }
    cout << sum[3]%1000000007;
}

C代码:

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    char str[n+1];
    scanf("%s", str);
    long long sum[4];
    sum[0] = sum[1] = sum[2] = sum[3] = 0;
    for(int i=0; i<n; i++) {
        if(str[i] == 'J') sum[0]++;
        else if(str[i] == 'X') sum[1] += sum[0];
        else if(str[i] == 'N') sum[2] += sum[1];
        else if(str[i] == 'U') sum[3] += sum[2]; 
    }
    printf("%lld", sum[3] % 1000000007);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值