挺有意思的一题。为了得到下一个序列,需要从最低位往前面找,找第一个可以提升的位置,关键就在于,如何知道某个位置是不是可以提升。首先,第一个可以提升的位置肯定是'('。然后,我们需要把这个'('改成')',但是,要保证一点,就是我们把这个位置的'('改成')'以后,序列必须仍然是正确的。假如我们从入栈出栈的角度来看,这就等于要求,在这个位置之前,栈不能为空,不然改为‘)’以后,就会出现“弹出空栈”这个错误操作。所以,我们要找的第一个可以提升的位置应该同时满足:
1. 必须是'('
2. 在该位置之前,括号栈不能为空。
#include <cstdio>
#include <cstring>
using namespace std;
int N;
char str[10000 + 5];
bool findNext() {
int i = N - 1;
int k;
int j;
int L = 0, R = 0;
for (i = N - 1; i >= 0; --i) {
if (str[i] == '(' && R - L - 1 >= 1) {
str[i] = ')';
j = i + 1;
for (k = 1; k <= L + 1; ++k) {
str[j] = '(';
++j;
}
j = N - 1;
for (k = 1; k <= R - 1; ++k) {
str[j] = ')';
--j;
}
return true;
}
if (str[i] == '(') ++L;
else ++R;
}
return false;
}
int main() {
scanf("%s", str);
N = strlen(str);
if (findNext()) {
printf("%s\n", str);
} else {
printf("No solution\n");
}
return 0;
}