C++程序:查找与目标相同的唯一子序列数量
假设我们有两个小写字符串 s 和 t,我们需要找到 s 的子序列中等于 t 的数量。如果答案非常大,则返回模 10^9 + 7 的结果。
例如,如果输入为 s = "abbd" t = "bd",则输出为 2,因为有两个可能的子序列 "bd"。
s[1] 与 s[3] 连接
s[2] 与 s[3] 连接。
为了解决这个问题,我们将遵循以下步骤:
m := 10^9 + 7
如果 t 的长度为 0,则:
返回 0
如果 t 等于 s,则:
返回 1
如果 t 的长度 > s 的长度,则:
返回 0
定义一个大小与 t 的长度 + 1 相同的数组 table,并用 0 填充
table[0] := 1
对于 i := 0,当 i < s 的长度,更新 (i 加 1),执行:
定义一个数组 onsave := table
对于 j := 0,当 j < table 的长度,更新 (j 加 1),执行:
如果 s[i] 等于 t[j],则:
table[j + 1] = (table[j + 1] mod m + onsave[j] mod m)
table[j + 1] = (table[j + 1] mod m + onsave[j] mod m)
让我们看下面的实现来更好地理解:
示例
#include <bits/stdc++.h> using namespace std; int solve(string s, string t) { int m = 1000000007; if (t.size() == 0) return 0; if (t == s) return 1; if (t.size() > s.size()) return 0; vector<int> table(t.size() + 1, 0); table[0] = 1; for (int i = 0; i < s.size(); i++) { vector<int> onsave = table; for (int j = 0; j < table.size(); j++) { if (s[i] == t[j]) { table[j + 1] = (table[j + 1] % m + onsave[j] % m) %m; } } } return table[t.size()] % m; } main(){ string s = "abbd", t = "bd"; cout << (solve(s, t)); }
输入
"abbd", "bd"
输出
2
广告