字符串中特定子序列出现的次数(动态规划)

题目:给定一个字符串,求子序列 “cwbc” 出现的次数
思路:动态规划
令 dp[i][j] 表示前 i 个字符中匹配了字符串 “cwbc” 中前 j 位(j = 1,2,3,4)的个数。

转移方程:

dp[i][1] = ( dp[i - 1][1] + ( s[i] == ‘c’ )) % Mod

dp[i][2] = ( dp[i - 1][2] + ( s[i] == ‘w’ ) * dp[i - 1][1] ) % Mod

dp[i][3] = ( dp[i - 1][3] + ( s[i] == ‘b’ ) * dp[i - 1][2] ) % Mod

dp[i][4] = ( dp[i - 1][4] + ( s[i] == ‘c’ ) * dp[i - 1][3] ) % Mod

此时内存会超标,使用滚动数组优化开销:

dp[1] = (dp[1] + (s[i] == ′ c′)) % Mod

dp[2] = (dp[2] + (s[i] == ′ w′) ∗ dp[1]) % Mod

dp[3] = (dp[3] + (s[i] == ′ b′) ∗ dp[2]) % Mod

dp[4] = (dp[4] + (s[i] == ′ c′) ∗ dp[3]) % Mod

#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
#define MAXN 100005
typedef long long ll;
ll dp[5];
int main()
{
	memset(dp, 0, sizeof(dp));
	string s;
	cin >> s;
	int n = s.length();
	for (int i = 1; i <= n; ++i)
	{
		s[i] = tolower(s[i]);
		dp[1] = (dp[1] + (s[i] == 'c')) % MOD;
		dp[2] = (dp[2] + (s[i] == 'w') * dp[1]) % MOD;
		dp[3] = (dp[3] + (s[i] == 'b') * dp[2]) % MOD;
		dp[4] = (dp[4] + (s[i] == 'c') * dp[3]) % MOD;
	}
	cout << dp[4] << endl;
	return 0;
}
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 你需要编写一个函数,接受两个参数:一个字符串和一个子字符串,函数的作用是返回在字符串出现字符串次数。你可以使用 Python 内置的 count() 方法来实现这个功能,示例如下: ```python def count_substring(string, sub_string): count = string.count(sub_string) return count ``` 这个函数接受两个参数,分别是字符串和子字符串。count() 方法会统计子字符串在原字符串出现次数,然后将统计结果返回。最后函数返回统计结果。 你可以将这个函数测试一下,例如: ```python string = "hello world, hello python" sub_string = "hello" count = count_substring(string, sub_string) print(count) ``` 这段代码的输出结果应该是 2,因为在原字符串出现了两次子字符串 "hello"。 ### 回答2: 要返回字符串特定字符串的数量,可以使用以下步骤: 1. 初始化一个计数器,用于记录子字符串的数量。 2. 使用循环遍历字符串的每个字符,从第一个字符开始。 3. 对于每个字符,使用另一个循环来检查以该字符为起点的子字符串是否与特定字符串匹配。 4. 如果匹配成功,则将计数器增加1。 5. 继续遍历下一个字符,重复第3步和第4步,直到遍历完整个字符串。 6. 最后返回计数器的值即为特定字符串在原始字符串的数量。 以下是一个示例代码: ```python def count_substring(string, substring): count = 0 for i in range(len(string)): if string[i:i+len(substring)] == substring: count += 1 return count ``` 在这个例子,使用了两个嵌套的循环。外层循环用于遍历字符串的每个字符,内层循环用于检查以该字符为起点的子字符串是否与特定字符串匹配。如果匹配成功,则计数器增加1。最后返回计数器的值即可。 这是一个简单的方法,但是当字符串很长或者特定字符串比较复杂时,性能可能会受到影响。在实际应用,可能需要考虑更高效的算法来处理这个问题。 ### 回答3: 要返回字符串特定字符串的数量,可以使用字符串的`count()` 方法。该方法接受一个子字符串作为参数,并返回该子字符串在原字符串出现次数。 下面是一个示例代码: ```python def count_substring(string, sub): count = string.count(sub) return count # 测试 string = "Hello World! Hello, my name is John. Hello." sub = "Hello" result = count_substring(string, sub) print(result) ``` 上述代码将输出结果为3,因为子字符串"Hello"在原字符串出现了3次。 希望对您有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值