C++ 可以通过删除由单个不同字符组成的子字符串来获得的最高分数
通过删除由单个不同字符组成的子字符串可以获得的最高分数是计算机科学和算法设计领域的一个众所周知的问题。问题陈述涉及到寻找删除二进制字符串中所有连续子字符串的最优解,并且对每个删除的长度为K的子字符串得分,其中K可以因每个子字符串而异。这个问题有多种实际应用,包括文本分析和压缩。
在本教程中,我们将使用C++来解决这个问题,并解释我们算法背后的逻辑。我们还将讨论我们解决方案的时间和空间复杂度,并提供一个逐步指南来实现它。所以让我们开始吧!
问题陈述
这个问题要求找到通过从二进制字符串S中删除任意长度的连续子字符串来获得的最高分数。大小为N的数组A包含每个长度的子字符串的分数,长度为K的删除子字符串的分数为A[K]。
示例1
输入
A binary string
S is given as "abb" and an array A is given as [2, 3, 1].
输出结果
A score of 6 can be achieved by removing substrings composed of
identical characters, resulting in the maximum attainable score.
说明:初始化时,得分为0且字符串为”abb”。我们移除索引为2的子字符串,其长度为1,并将得分增加相应的值。结果,字符串变为”ab”,得分增加到1。接下来,我们移除索引为1的子字符串,将其相应的值添加到得分中,并将字符串修改为”a”。得分变为4。最后,我们移除索引为0的子字符串,将其相应的值添加到得分中,并将字符串更新为空字符串。最终得分为6。
示例2
输入
A binary string S is given as "abb" and an array A is given as [1, 3, 1].
输出
A score of 4 can be achieved by eliminating substrings composed of
identical characters, resulting in the maximum possible score.
Explanation:从得分为0开始,初始字符串”abb”经历了子字符串的移除。具体来说,移除了子字符串”bb”,得分增加了数组A中对应的值,结果得到一个修改后的字符串”a”和得分3。随后,剩余字符”a”被移除,将A[1]加到得分上,结果得到一个空字符串和最终得分4。这个过程展示了该程序如何通过有策略地从输入字符串中移除子字符串来计算最大可达得分。
算法
1. 首先包括必要的头文件:’iostream’、’vector’、’map’和’algorithm’。
2. 声明一个名为’dp’的’std::map’,用于存储预计算的结果。
3. 定义一个函数’calculateMaximumScore’,该函数接受一个字符串’str’和一个整数向量’nums’作为输入,并返回一个整数。
4. 在’calculateMaximumScore’函数内部:
- 检查字符串’s tr’是否存在于映射’d p’中。如果找到,返回相应的值。
-
计算输入字符串’str’的长度,并将其存储在变量’len’中。
-
如果字符串的长度为0,则返回0。
-
如果字符串的长度为1,则返回’vec tor’的第一个元素。
-
将变量’start’初始化为0,’max Score’初始化为-1。
-
以’start’作为循环变量开始循环,循环条件是’start’小于’len’。
- 在循环中,将另一个变量’end’初始化为’start’。
-
以’end’为循环变量开始一个内部循环,循环条件是’end’小于’len’。
- 检查字符串’s tr’中索引’end’处的字符是否与索引’start’处的字符不同。
-
通过从字符串’s tr’的索引’start’到’end’的字符提取字符创建一个子字符串’s ub’。
-
通过将’start’和’end’之前和之后的子字符串连接起来获得的修正字符串’s tr’,使用’nums’向量中索引’s ub.size() – 1’的值加上递归调用’calculateMaximumScore’函数的结果,计算最大分数。
-
用当前’maxScore’和计算得到的分数的最大值更新’max Score’。
-
将’end’增加1。
-
检查’end’是否等于’len’。如果为真,跳出外部循环。
-
将’start’增加1。
5. 在’main’函数中:
- 声明一个字符串变量’inputStr’,并将其初始化为输入字符串”abb”。
-
声明一个整数向量’inputNums’,并将其初始化为输入值{2, 3, 1}。
-
调用’calculateMaximumScore’函数,并将’inputStr’和’inputNums’作为参数,输出结果。
该算法概述了程序根据给定的输入字符串和数字向量计算最大分数的步骤。
示例
使用C++实现上述算法
下面的C++程序实现了一种动态规划的方法来计算从给定字符串中删除子字符串可达到的最大分数。它利用记忆化来存储预先计算的结果,并通过将问题分解成较小的子问题来优化递归。通过迭代地检查不同的子字符串,它通过考虑删除每个子字符串并递归地计算修改后的字符串的分数来确定最大分数。
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
std::map<std::string, int> dp;
int calculateMaximumScore(std::string str, std::vector<int> nums) {
if (dp.find(str) != dp.end()) {
return dp[str];
}
int len = str.size();
if (len == 0) {
return 0;
}
if (len == 1) {
return nums[0];
}
int start = 0;
int maxScore = -1;
while (start < len) {
int end = start;
while (end < len) {
if (str[end] != str[start]) {
start = end;
break;
}
std::string sub = str.substr(start, end - start + 1);
maxScore = std::max(maxScore, nums[sub.size() - 1] +
calculateMaximumScore(str.substr(0, start) +
str.substr(end + 1), nums));
end += 1;
}
if (end == len) {
break;
}
}
dp[str] = maxScore;
return maxScore;
}
int main() {
std::string inputStr = "abb";
std::vector<int> inputNums = {2, 3, 1};
std::cout << "The maximum score possible by removing substrings made up of single distinct character: " << calculateMaximumScore(inputStr, inputNums);
return 0;
}
输出结果
The maximum score possible by removing substrings made up of single distinct character: 6
结论
总的来说,这个提供的C++程序通过从给定的字符串中删除由单个不同字符组成的子字符串来有效地计算最大可达到的得分。通过利用动态规划的方法和备忘录,程序通过存储预计算的结果来优化计算过程。通过递归地探索不同的子字符串,程序通过考虑删除每个子串并选择最高得分路径来确定最优得分。该程序提供了一种智能地从输入字符串中删除子串以最大化得分的健壮解决方案。