由相同数量的左括号'('和右括号')'构成的字符串,只需要将一定长度(可以为0)的前缀移动到字符串的末尾,就可以使其中的左右括号匹配成功,即成为括号语句。在这里,我们不用数学方法去证明该命题的正确性,而是编程求出所有可行的前缀长度。
输入格式:
输入在一行中给出由'('和')'构成的字符串,长度不超过106。题目保证字符串中左右括号的数量相同。
输出格式:
在一行中输出所有可行的前缀长度,按升序排列。数值间用空格分开,末尾的值后面没有空格。
输入样例:
(()))))()(())((()))()(((
输出样例:
7 9 13 19 21
注:上述长度的前缀各自移动到末尾后得到的括号语句如下:
长度7: ()(())((()))()((((()))))
长度9: (())((()))()((((()))))()
长度13:((()))()((((()))))()(())
长度19:()((((()))))()(())((()))
长度21:((((()))))()(())((()))()
代码长度限制
16 KB
时间限制
100 ms
内存限制
64 MB
代码
#include <iostream>
using namespace std;
int main()
{
string s;
cin>>s;
int len=s.size();
int num[len+1];
int least=0;
num[0]=0;
int index=0;
for(int i=0;i<len;i++)
{
if(s[i]=='(')num[i+1]=num[i]+1;
else
{
num[i+1]=num[i]-1;
if(num[i+1]<least)
{
least=num[i+1];
index=i+1;
}
}
}
cout<<index;
for(int i=index+1;i<len+1;i++)
{
if(num[i]==least)
{
cout<<" "<<i;
}
}
return 0;
}