小 V 有一个长度为 的字符串 ,其仅包含小写质字母。他可以对这个串做以下两种操作任意次: 删除这个字符串的第一个字符; 删除这个字符串的第二个字符,然后把左右两部分拼接起来。 小 V 想知道他一共可以得到多少种不同的字符串?注意:空串不计入答案内。c++完整代码
时间: 2024-10-24 15:07:50 浏览: 12
要解决这个问题,我们可以使用动态规划的方法。设`dp[i]`表示从原始字符串`s`的前`i`个字符中,能够生成的不同字符串数量(不包括空串)。对于每个`i`,我们有两种选择:
1. 不删除第一个字符,即保留`s[0:i]`,则`dp[i] = dp[i - 1]`,因为我们只考虑了第一个字符不动的情况。
2. 删除第一个字符,那么我们需要从剩下的子串`s[1:i]`生成不同的字符串,所以`dp[i] = dp[i - 2] + dp[i - 1]`,因为这两种情况都可以形成新的字符串。
初始状态是`dp[0] = 1`(空串),`dp[1] = 1`(只有一个字符时也是一种字符串)。
下面是对应的C++代码实现:
```cpp
#include <iostream>
#include <vector>
int numDistinctStrings(std::string s) {
int n = s.length();
std::vector<int> dp(n + 1, 0);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i - 1]; // 不删除第一个字符
if (i >= 2) {
dp[i] += dp[i - 2]; // 删除第一个字符后拼接
}
}
return dp[n];
}
int main() {
std::string input;
std::cout << "Enter the string: ";
std::cin >> input;
int result = numDistinctStrings(input);
std::cout << "The number of distinct strings is: " << result << std::endl;
return 0;
}
```
现在你可以运行这个程序并输入你想要的字符串,它将输出可以得到的不同字符串的数量。
阅读全文