無需額外空間的 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