這種匹配(消除)問題也是棧的擅長所在!
844.比較含退格的字符串
給定 S 和 T 兩個字符串,當它們分別被輸入到空白的文本編輯器后,判斷二者是否相等,并返回結果。# 代表退格字符。
注意:如果對空文本輸入退格字符,文本繼續為空。 示例 1:
示例 2:
- 輸入:S = "ab##", T = "c#d#"
- 輸出:true
- 解釋:S 和 T 都會變成 “”。
示例 3:
- 輸入:S = "a##c", T = "#a#c"
- 輸出:true
- 解釋:S 和 T 都會變成 “c”。
示例 4:
- 輸入:S = "a#c", T = "b"
- 輸出:false
- 解釋:S 會變成 “c”,但 T 仍然是 “b”。
思路
本文將給出 空間復雜度O(n)的棧模擬方法 以及空間復雜度是O(1)的雙指針方法。
普通方法(使用棧的思路)
這道題目一看就是要使用棧的節奏,這種匹配(消除)問題也是棧的擅長所在,跟著一起刷題的同學應該知道,在棧與隊列:匹配問題都是棧的強項,我就已經提過了一次使用棧來做類似的事情了。
那么本題,確實可以使用棧的思路,但是沒有必要使用棧,因為最后比較的時候還要比較棧里的元素,有點麻煩。
這里直接使用字符串string,來作為棧,末尾添加和彈出,string都有相應的接口,最后比較的時候,只要比較兩個字符串就可以了,比比較棧里的元素方便一些。
代碼如下:
classSolution{
public:
boolbackspaceCompare(stringS,stringT){
strings;//當棧來用
stringt;//當棧來用
for(inti=0;iif(S[i]!='#')s+=S[i];
elseif(!s.empty()){
s.pop_back();
}
for(inti=0;iif(T[i]!='#')t+=T[i];
elseif(!t.empty()){
t.pop_back();
}
}
if(s==t)returntrue;//直接比較兩個字符串是否相等,比用棧來比較方便多了
returnfalse;
}
};
- 時間復雜度:O(n + m), n為S的長度,m為T的長度 ,也可以理解是O(n)的時間復雜度
- 空間復雜度:O(n + m)
當然以上代碼,大家可以發現有重復的邏輯處理S,處理T,可以把這塊公共邏輯抽離出來,代碼精簡如下:
classSolution{
private:
stringgetString(conststring&S){
strings;
for(inti=0;iif(S[i]!='#')s+=S[i];
elseif(!s.empty()){
s.pop_back();
}
}
returns;
}
public:
boolbackspaceCompare(stringS,stringT){
returngetString(S)==getString(T);
}
};
性能依然是:
- 時間復雜度:O(n + m)
- 空間復雜度:O(n + m)
優化方法(從后向前雙指針)
當然還可以有使用 O(1) 的空間復雜度來解決該問題。
同時從后向前遍歷S和T(i初始為S末尾,j初始為T末尾),記錄#的數量,模擬消除的操作,如果#用完了,就開始比較S[i]和S[j]。
動畫如下:
如果S[i]和S[j]不相同返回false,如果有一個指針(i或者j)先走到的字符串頭部位置,也返回false。
代碼如下:
classSolution{
public:
boolbackspaceCompare(stringS,stringT){
intsSkipNum=0;//記錄S的#數量
inttSkipNum=0;//記錄T的#數量
inti=S.size()-1;
intj=T.size()-1;
while(1){
while(i>=0){//從后向前,消除S的#
if(S[i]=='#')sSkipNum++;
else{
if(sSkipNum>0)sSkipNum--;
elsebreak;
}
i--;
}
while(j>=0){//從后向前,消除T的#
if(T[j]=='#')tSkipNum++;
else{
if(tSkipNum>0)tSkipNum--;
elsebreak;
}
j--;
}
//后半部分#消除完了,接下來比較S[i]!=T[j]
if(i0||j0)break;//S或者T遍歷到頭了
if(S[i]!=T[j])returnfalse;
i--;j--;
}
//說明S和T同時遍歷完畢
if(i==-1&&j==-1)returntrue;
returnfalse;
}
};
- 時間復雜度:O(n + m)
- 空間復雜度:O(1)
-
字符串
+關注
關注
1文章
585瀏覽量
20619 -
代碼
+關注
關注
30文章
4841瀏覽量
69180 -
編輯器
+關注
關注
1文章
807瀏覽量
31328
原文標題:比較含退格的字符串
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
N2O(一氧化二氮)氣體和紅外N2O(一氧化二氮)氣體傳感器
![<b class='flag-5'>N2O</b>(一氧化二氮)氣體和紅外<b class='flag-5'>N2O</b>(一氧化二氮)氣體傳感器](https://file1.elecfans.com/web3/M00/06/E9/wKgZO2eQktKAMeZJAAFMEtObiy8830.png)
AI時代下芯片復雜度飆升,思爾芯國產硬件仿真加速芯片創新
![AI時代下芯片<b class='flag-5'>復雜度</b>飆升,思爾芯國產硬件仿真加速芯片創新](https://file.elecfans.com/web2/M00/4B/6A/pYYBAGKoTXWAFdqwAAAWmg44LUs841.png)
芯片設計復雜度劇增,紫光芯片云 3.0 助力企業搭建專業設計環境
![芯片設計<b class='flag-5'>復雜度</b>劇增,紫光芯片云 3.0 助力企業搭建專業設計環境](https://file1.elecfans.com/web3/M00/03/EF/wKgZO2dtHHqARniEAAWuhlWOzVs368.png)
DoIP協議棧簡介及主要功能
![DoIP協議<b class='flag-5'>棧</b>簡介及主要功能](https://file1.elecfans.com/web1/M00/F4/FC/wKgaoWc0V4WAHiTlAAAWsDzh_-M234.png)
線程棧分配惹的禍?系統異常這樣解決!
![線程<b class='flag-5'>棧</b>分配惹的禍?系統異常這樣解決!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
時間復雜度為 O(n^2) 的排序算法
![時間<b class='flag-5'>復雜度</b>為 <b class='flag-5'>O</b>(<b class='flag-5'>n</b>^2) 的排序算法](https://file1.elecfans.com//web2/M00/0A/90/wKgaomcQeFWAejYVAAF0WDlfIVY746.jpg)
PCB與PCBA工藝復雜度的量化評估與應對措施
業務復雜度治理方法論--十年系統設計經驗總結
![業務<b class='flag-5'>復雜度</b>治理<b class='flag-5'>方法</b>論--十年系統設計經驗總結](https://file1.elecfans.com//web2/M00/06/47/wKgaombZS4CAKE9YAABRiabTLYI872.png)
CISC(復雜指令集)與RISC(精簡指令集)的區別
復雜電磁環境模擬系統設計方案
PCB與PCBA工藝復雜度的量化評估與應用初探!
模擬示波器和模擬萬用表的區別
軟件可配置模擬 I/O 的設計理念
![軟件可配置<b class='flag-5'>模擬</b> I/<b class='flag-5'>O</b> 的設計理念](https://file1.elecfans.com/web2/M00/D3/35/wKgZomYkgl2AT15uAACb2eyhUyo629.jpg)
評論