題目鏈接:HDOJ5479
題目大意:t組測試,每組測試一個由”(”和”)”組成的字符串S,問要使S沒有子串括號能匹配的最小代價是多少。一個代價定義爲一次將“(”變成“)”,或則相反。
數據範圍:
1≤|S|≤1,000
要使S的子串都沒有括號匹配“()”,只有可能將S變成3種情況。
1.全是左括號“((…..”
2.全是右括號“))…..”
3.左邊右括號,右邊左括號“…..))((…..”
參考代碼:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
string st;
cin >> st;
int len = st.length();
int l[len], r[len];
for(int i = 0; i < len; ++i)//l[i]表示將[0,i]都變成")"的代價
{
if(i == 0) l[i] = st[i] == '(';
else if(st[i] == '(') l[i] = l[i - 1] + 1;
else l[i] = l[i - 1];
}
for(int i = len - 1; i >= 0; --i)//r[i]表示將[i,len - 1]都變成"("的代價
{
if(i == len - 1) r[i] = st[i] == ')';
else if(st[i] == ')') r[i] = r[i + 1] + 1;
else r[i] = r[i + 1];
}
int ans = 2e9;
for(int i = 0; i < len; ++i)//在3中情況中取小值
ans = min(ans, l[i] + r[i] - 1) ;
cout << ans << endl;
}
return 0;
}