在给定字符串中插入最少字符数以删除相邻重复字符
data structurec++programming
在本题中,我们将计算删除所有相邻重复字符所需插入的最少字符数。
为了解决这个问题,我们需要计算相邻重复字符对的总数。
问题描述 – 给定一个名为 str 的字符串,其中包含 N 个字母字符。我们需要找到需要添加到字符串中的不同字符的总数,以使结果字符串不包含任何相邻的重复字符。
示例
输入
str = "ccddrt"
输出
2
说明 – 我们需要在"cc"和"dd"之间各插入一个字符。
输入
str = 'abcdefrt'
输出
0
解释– 该字符串不包含任何相邻的重复字符。因此,我们不需要在其中插入任何字符。
输入
str = 'ppppppp'
输出
6
解释– 该字符串的所有字符都相同。因此,我们需要在字符串中插入长度为 1 的字符。
方法 1
此方法将计算字符串中相邻重复字符的总数。最终计数即为答案,因为我们需要在每个相邻的重复字符之间插入一个新字符。
算法
步骤 1 – 使用字符串大小初始化 str_size 变量。
步骤 2 – 另外,声明并用 0 初始化 total_steps 变量,用于存储字符串中的最小插入次数。
步骤 3 – 使用 for 循环开始遍历字符串。
步骤 4 – 如果第 p 个索引处的字符与第 (p - 1) 个索引处的字符相同,则将 total_Steps 加 1。
步骤 5 – 最后,返回 total_steps。
示例
#include <iostream> using namespace std; int totalInsertions(string alpha) { // 字符串长度 int str_size = alpha.size(); // 存储加法次数 int total_steps = 0; // 迭代字符串 for (int p = 1; p < str_size; p++) { if (alpha[p] == alpha[p - 1]) total_steps++; } // 返回加法次数 return total_steps; } int main() { string str = "ccddrt"; cout << "删除相邻重复项所需的总添加次数为 - " << totalInsertions(str); return 0; }
输出
删除相邻重复项所需的总添加次数为 - 2
时间复杂度 – 迭代字符串,复杂度为 O(N)。
空间复杂度 – 因为我们不使用动态空间,所以复杂度为 O(1)。
上述问题与查找给定字符串中相邻重复字符的总数非常相似。这两个问题的解决方案相同。程序员还可以尝试使用 while 循环遍历字符串,并计算从给定字符串中删除所有相邻重复字符所需的最少插入次数。