比如输入 2(+(5+1( ) ,那么 2+(1+(5+1+(1))) 是一种解法。
注意:插入的也只能是这4种字符。 ( )非法,((12))合法
这里提供一个思路,就是首先处理括号,再处理其它;并且添加的括号只加在开头和结尾;这样做是基于以下的事实:
1. 在中间加入括号可能产生新的非法串,如 “)(” ,在首尾则不会;
2. 在中间加括号无法使得修改步数更少。
具体的,分别统计出所有左括号和右括号的个数,以及成功配对的个数,剩下的就是需要我们添加括号来配对;对每一个多出的右括号,在最左端添加等数量的左括号;对多出的左括号做相同处理。
处理好了括号配对后,就要考虑其它的合法问题,具体如何做?
一种方法是考虑非法的符号对,所有的配对组合为 A(2,4) = 12,其中非法的配对如下:
1. num:(
2. + : )
3. ( : + or )
4. ) :num or (
这些非法串都只有唯一的修改方法,即添加 num 或者 + ;并不用再管正反括号。
读者可以思考为什么考虑两两组合的非法串,而不是考虑某种符号后面接什么会产生非法串。
大致代码如下:
int main(void){
cin>>str;
int lnum,rnum;
lnum=rnum=0;
for(char*p=str;*p;p++){
if(*p=='(')
lnum++;
else if(*p==')'){
if(lnum>0)
lnum--;
else
rnum++;
}
}
int j=0;
for(int i=0;i<rnum;i++)
s[j++] = '(';
// handle illegal sequence
// ......
for(int i=0;i<lnum;i++)
s[j++] = ')';
s[j++]=0;
cout<<s<<endl;
system("pause");
return 0;
}