子序列个数 【动态规划问题】(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;
}
更多推荐

所有评论(0)