赞
踩
学校考试的一道题,写了很久写不出来,后面才知道这就是动态规划的题,记录一下
给一个字符串,在里面寻找有多少个给定子序列(注意子序列与子串的不同)
子串:下标连续
子序列:下标可以不连续
常规思路大体如下,但是字符串序列长了就可能会运行超时
- 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
- 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)
- #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;
- }
- #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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。