当前位置:   article > 正文

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

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

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

题目大意:

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

子串:下标连续

子序列:下标可以不连续

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

  1. count=0
  2. for i in range(len(str)):
  3. if str[i]=='J':
  4. for j in range(i+1,len(str)):
  5. if str[j]=='X':
  6. for k in range(j+1,len(str)):
  7. if str[k]=='N':
  8. for e in range9(k+1,len(str)):
  9. if str[e]=='U':
  10. count+=1

Python正确代码:

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

C++代码:

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int n;
  5. cin >> n;
  6. char str[n+1];
  7. cin >> str;
  8. long long sum[4];
  9. sum[0] = sum[1] = sum[2] = sum[3] = 0;
  10. for(int i=0;i<n;i++){
  11. if(str[i]=='J') sum[0]++;
  12. else if(str[i]=='X') sum[1] += sum[0];
  13. else if(str[i]=='N') sum[2] += sum[1];
  14. else if(str[i]=='U') sum[3] += sum[2];
  15. }
  16. cout << sum[3]%1000000007;
  17. }

C代码:

  1. #include <stdio.h>
  2. int main() {
  3. int n;
  4. scanf("%d", &n);
  5. char str[n+1];
  6. scanf("%s", str);
  7. long long sum[4];
  8. sum[0] = sum[1] = sum[2] = sum[3] = 0;
  9. for(int i=0; i<n; i++) {
  10. if(str[i] == 'J') sum[0]++;
  11. else if(str[i] == 'X') sum[1] += sum[0];
  12. else if(str[i] == 'N') sum[2] += sum[1];
  13. else if(str[i] == 'U') sum[3] += sum[2];
  14. }
  15. printf("%lld", sum[3] % 1000000007);
  16. return 0;
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/521500
推荐阅读
相关标签
  

闽ICP备14008679号