在给定条件下最大化从字符串中删除的字符数
在这个问题中,我们需要删除字符串中的最大字符数,如果相邻字符是前一个字符。
我们可以找到每个字符的出现次数,并检查其任何相邻字符是否为前一个字符,我们可以删除该特定字符。
问题陈述 - 我们给定一个包含 N 个字母字符的字符串。给定的任务是,我们需要删除最大数量的字符,如果任何相邻字符是字母表中的前一个字符,则可以删除字符串的任何字符。最后,打印删除的字符计数。
示例
输入
str = 'acd'
输出
1
解释 - 我们可以删除 'd',因为相邻字符是 'c'。
输入
str = "efghijk"
输出
6
解释 - 我们可以删除 'k',因为相邻字符是 'j'。
我们可以删除 'j',因为其相邻字符是 'i'。
这样,我们可以删除除 'e' 之外的所有字符。因此,我们可以删除 6 个字符。
输入
str = "agnbpc";
输出
0
解释 - 字符串的任何字符都没有相邻字符是字母表中的前一个字符。
方法 1
此方法将从 'z' 到 'a' 开始。我们将找到 'z'、'y'、'x' 等的所有出现次数。如果我们找到任何字母的前一个相邻字符,我们可以删除当前字符。
算法
步骤 1 - 使用循环反向遍历字母字符。
步骤 2 - 使用另一个嵌套循环遍历字符串。如果字符串中的字符等于字符 p,请执行以下步骤。
步骤 3 - 检查任何相邻字符是否等于前一个字符;如果是,则从字符串中删除该字符,并将 q 的值减 1。
步骤 4 - 返回当前字符串长度减去更新后字符串长度的结果。
示例
#include <iostream> using namespace std; int numOfMaxCharacters(string alpha, int str_len) { // Traverse alphabets from 'z' to 'a' for (int p = 'z'; p > 'a'; p--) { // Traverse string for (int q = 0; q < alpha.size(); q++) { // If the character matches if (alpha[q] == p) { // Check if adjacent characters are less than the current character if (alpha[q - 1] == p - 1 || alpha[q + 1] == p - 1) { alpha.erase(q, 1); q = -1; } } } } // Return answer return str_len - alpha.size(); } int main() { string str = "efghijk"; // String size int str_len = str.size(); cout << "The number of maximum characters that we can remove is " << numOfMaxCharacters(str, str_len); }
输出
The number of maximum characters that we can remove is 6
时间复杂度 - O(N),因为我们遍历了字符串。
空间复杂度 - O(1)
在这里,我们以反向顺序删除每个字符以最大化删除。如果我们以随机顺序从字符串中删除字符,我们可能无法删除最大字符。
广告