c实现 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效。
时间: 2024-01-06 17:05:00 浏览: 83
字符串括号匹配(c实现)
4星 · 用户满意度95%
可以使用栈的数据结构来解决这个问题。具体的思如下:
1. 创建一个空栈来存储左括号 '(' 的索引。
2. 遍历字符串 S ,对于每个字符:
- 如果是左括号 '(',将其索引入栈。
- 如果是右括号 ')',判断栈是否为空:
- 如果栈为空,说明当前右括号没有匹配的左括号,需要添加一个左括号。
- 如果栈不为空,说明当前右括号匹配了一个左括号,将栈顶的左括号索引出栈。
3. 遍历结束后,栈中剩余的左括号索引表示没有匹配的右括号,需要添加相应数量的右括号来使字符串有效。
下面是使用 C 语言实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int minAddToMakeValid(char *S) {
int len = strlen(S);
int *stack = (int *)malloc(sizeof(int) * len); // 创建栈
int top = -1; // 栈顶指针
for (int i = 0; i < len; i++) {
if (S[i] == '(') {
stack[++top] = i; // 左括号入栈
} else if (S[i] == ')') {
if (top == -1) {
stack[++top] = i; // 右括号入栈
} else {
top--; // 匹配到一个左括号,出栈
}
}
}
int count = top + 1; // 栈中剩余的左括号数量即为需要添加的右括号数量
free(stack); // 释放栈内存
return count;
}
int main() {
char S[] = "((())"; // 示例字符串
int minAdd = minAddToMakeValid(S);
printf("需要添加的括号数量:%d\n", minAdd);
return 0;
}
```
这段代码的输出结果是:需要添加的括号数量:1。表示在示例字符串 "((())" 中,只需要添加一个右括号才能使字符串有效。
阅读全文