题目链接 https://vjudge.net/problem/HihoCoder-1671
【思路】
类似括号匹配,递归函数的妙用。le,ri记录括号的相对位置。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5000050;
int len;
char s[maxn];
int st[maxn], top = -1;
int le[maxn], ri[maxn];
void dfs(int l, int r, bool rev) {
if (!rev) {
for (int i = l; i <= r; ++i) {
if ('(' != s[i]) printf("%c", s[i]);
else {
dfs(i + 1, ri[i] - 1, 1);
i = ri[i];
}
}
}
else {
for (int i = r; i >= l; --i) {
if (')' != s[i]) printf("%c", s[i]);
else {
dfs(le[i] + 1, i - 1, 0);
i = le[i];
}
}
}
}
int main() {
scanf("%s", s);
len = strlen(s);
for (int i = 0; i < len; ++i) {
if ('(' == s[i]) st[++top] = i;
else if (')' == s[i]) {
le[i] = st[top];
ri[st[top]] = i;
--top;
}
}
dfs(0, len - 1, 0);
printf("\n");
return 0;
}
本文介绍了一种解决括号匹配问题的方法,并通过递归函数实现字符串的重新组织。利用栈来记录左括号的位置,进而确定左右括号的对应关系。在此基础上,采用递归方式处理括号内的子串,最终输出处理后的字符串。
&spm=1001.2101.3001.5002&articleId=79193084&d=1&t=3&u=583107da667749758e3e79f79e43c6ce)
678

被折叠的 条评论
为什么被折叠?



