给出一个字符串 s
(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中 不应 包含任何括号。
示例 1:
输入:s = "(abcd)" 输出:"dcba"
示例 2:
输入:s = "(u(love)i)" 输出:"iloveu" 解释:先反转子字符串 "love" ,然后反转整个字符串。
示例 3:
输入:s = "(ed(et(oc))el)" 输出:"leetcode" 解释:先反转子字符串 "oc" ,接着反转 "etco" ,然后反转整个字符串。
示例 4:
输入:s = "a(bcdefghijkl(mno)p)q" 输出:"apmnolkjihgfedcbq"
首先先写一个反转函数,用于字符串反转
void reverse(char* str, int strSize) {
for (int j = 0; j < strSize / 2; j++) {
char tmp = str[j];
str[j] = str[strSize - j - 1], str[strSize - j - 1] = tmp;
}
}
void reverse(char* str, int strSize) {
for (int j = 0; j < strSize / 2; j++) {
char tmp = str[j];
str[j] = str[strSize - j - 1], str[strSize - j - 1] = tmp;
}
}
char* reverseParentheses(char* s) {
int n = strlen(s);
char* stk[n];
int top = 0;
char* str = malloc(sizeof(char) * (n + 1));
str[0] = '\0';
int strSize = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '(') {
stk[top] = malloc(sizeof(char) * (strSize + 1));
memcpy(stk[top], str, sizeof(char) * (strSize + 1));
top++;
str[0] = '\0';
strSize = 0;
} else if (s[i] == ')') {
reverse(str, strSize);
int len = strlen(stk[top - 1]);
for (int j = strSize; j >= 0; j--) {
str[j + len] = str[j];
}
memcpy(str, stk[top - 1], sizeof(char) * len);
strSize += len;
top--;
} else {
str[strSize++] = s[i];
str[strSize] = '\0';
}
}
return str;
}