題目來源
http://acm.hdu.edu.cn/showproblem.php?pid=3351
問題描述
我沒有故事了。多年來,我一直在寫故事,有些故事很愚蠢,只是爲了使簡單的問題看起來很難而複雜的問題看起來很容易。
通過打開和關閉大括號,將獲得一個完整的非空字符串。您的任務是找到使字符串穩定所需的最少“操作”數。穩定的定義如下:
1.空字符串是穩定的。
2.如果S穩定,則{S}也穩定。
3.如果S和T都穩定,則ST(兩者的串聯)也穩定。所有這些字符串都是穩定的:{},{} {}和{{} {}};但這些都不是:} {,{{} {或{} {。
字符串上唯一允許的操作是用一個封閉的花括號代替一個開放的花括號,反之亦然。
輸入值
您的程序將在一個或多個數據集上進行測試。每個數據集在一行中描述。該行是一個由開括號和閉括號組成的非空字符串,僅此而已。最多有2000個花括號。所有序列的長度均等。
輸入的最後一行由一個或多個“-”(減號)組成。
輸出量
對於每個測試用例,打印以下行:
k. N
其中k是測試用例編號(從1開始),N是將給定字符串轉換爲平衡字符串所需的最小操作數。
注意:N前面有一個空格。
樣本輸入
} {
{} {} {}
{{{}
-
樣本輸出
1. 2
2. 0
3. 1
代碼
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<inttypes.h>
using namespace std;
#include<stack>
int main()
{
string str;int t = 1;
while(cin>>str && str[0]!='-'){
int i = 0,ans = 0;stack<char>S1,S2;//S1壓入'{' S2壓入'}'
while(str[i]!='\0'){
if(str[i] == '}'){
if(!S1.empty())S1.pop(); //匹配成功 S1彈出一個'{'
else S2.push('}');//無法匹配 將'}'壓入S2中
}
else{
S1.push('{'); //如果輸入的是'{' 將其壓入S1中
}
i++;//往後掃描
}
while(S1.size()>=2){ans++;S1.pop();S1.pop();} //如果S1的長度大於等於2 採用就近原則匹配 比如'{{'變爲'{}' ans++
while(S2.size()>=2){ans++;S2.pop();S2.pop();} //如果S2的長度大於等於2 採用就近原則匹配 比如'}}'變爲'{}' ans++
//就近匹配完之後 如果S1 S2還非空 說明只能是'}' '{' 這樣需要變化兩次 -->'{}' 所以加上兩個棧的長度之和
ans += S1.size() + S2.size();
cout<<t<<". "<<ans<<endl;
t++;
}
return 0;
}