无需额外空间的 C++ 程序,用于替换字符串中所有出现的“AB”为“C”
在本文中,我们将用“C”替换给定字符串(包含大写拉丁字符)中所有出现的“AB”。所有“AB”都将变成“C”,但单个“A”和“B”不会受到影响。
让我们来看一些输入场景:
让我们假设一个字符串“ABOUTME”
Input: "ABOUTME" Result: COUTME
我们从索引 1 开始遍历字符串。然后我们分别检查当前元素和前一个元素是否为“B”和“A”。如果找到,我们将最后一个附加的字符(“A”)替换为“C”。
当输入字符串中不存在子字符串“AB”时,将出现最坏情况下的时间复杂度。例如,考虑字符串“cloud”
Input: "CLOUD" Result: CLOUD
整个字符串都被遍历,但没有找到“AB”子字符串。
让我们也来看一下输入字符串中包含字符“A”和“B”,但它们并不连续的情况。
Input: "ALIBI" Result: ALIBI
输出字符串保持不变,因为子字符串 AB 没有连续地出现在输入字符串中。
算法
任何字符串作为输入并被遍历。
字符串中的每个元素都与子字符串“AB”的字符(即“A”和“B”)进行比较。
如果找到匹配项,则字符串的大小减少 1,并将“AB”替换为“C”。
得到的字符串作为包含替换字母的输出。
示例
例如,让我们取一个字符串 = “TUTORIALSABPOINT”,我们将实现一个 C++ 程序来检查字符串中是否存在“AB”,并将其替换为字符“C”:
#include <iostream> using namespace std; string solve(string s) { if(s.size() == 0) return s; string ans = ""; ans+=s[0]; for(int i=1;i<s.size();i++) { if(s[i] == 'B' && s[i-1] == 'A') { ans[ans.size()-1] = 'C'; } else { ans+=s[i]; } } return ans; } int main() { string s = "TUTORIALSABPOINT"; cout << solve(s) << endl; return 0; }
输出
TUTORIALSCPOINT
示例
解决这个问题的另一种方法是使用两个索引。我们将使用一个索引来跟踪原始字符串,另一个索引用于跟踪修改后的字符串。当我们在索引 j(例如原始字符串)处遇到“AB”时,我们将 j 加 2,并将 i(例如修改后的字符串)加 1。如果不是,我们将通过复制字符来分别递增每个索引。
#include <iostream> using namespace std; string solve(string s) { int i = 0; int j = 0; int terminatingIndex = s.size(); while (j<s.size()-1) { if (s[j] == 'A' && s[j+1] == 'B') { j = j + 2; s[i++] = 'C'; continue; } s[i++] = s[j++]; } if (j==s.size()-1) { s[i++] = s[j]; } terminatingIndex = i; return s.substr(0, terminatingIndex); } int main() { string s= "ARTICLESABPOINT"; cout << solve(s); return 0; }
输出
ARTICLESCPOINT
结论
只需从索引 1 遍历字符串即可计算我们的新字符串并检查字符串中是否存在“AB”。我们创建了一个 ans 字符串来获取唯一的字符串,但除了这个之外,我们没有使用任何额外的空间。
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP