给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
示例:
输入:s = "()"
输出:tue
输入:s = "()[]{}"
输出:true
输入:s = "(]"
输出:false
输入:s = "([)]"
输出:false
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 10^4
s 仅由括号 '()[]{}'组成
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Print(char *src, int len);
int Print2(char *src, int len);
int main(void ) {
//char str[] = "([)]";
//char str[] = "()[]";
char str[100] = "";
fgets (str, 100, stdin);
int len = strlen (str)-1;
str[len] = '\0';
int ret = Print2 (str, len);
printf ("%s\n", (ret==1?"true":"false"));
return 0;
}
int Print2(char *src, int len)
{
if (len%2 != 0)
return 0;
int top = 0;
char stack[64] = "";
char temp = 0;
for (int i = 0;i < len; i ++) {
if (src[i] == '(' || src[i]=='[' || src[i]=='{') {
stack[top] = src[i];
top ++;
} else {
if (top == 0)
return 0;
if (src[i] == ')')
temp = '(';
else if (src[i] == ']')
temp = '[';
else
temp = '{';
if (temp == stack[top-1]) {
top --;
} else {
return 0;
}
}
}
if (top != 0)
return 0;
return 1;
}
int Print(char *src, int len)
{
int flag = 0;
for (int i = 0;i < len-1;i ++) {
switch (src[i]) {
case '(':
if (src[i+1] == ')' || src[len-1-i] == ')') {
flag = 1;
++ i;
} else {
printf ("( %d\n", i);
return 0;
}
break;
case '[':
if (src[i+1] == ']' || src[len-1-i] == ']') {
flag = 1;
++ i;
} else {
printf ("[ %d\n", i);
return 0;
}
break;
case '{':
if (src[i+1] == '}' || src[len-1-i] == '}') {
flag = 1;
++ i;
} else {
printf ("{ %d\n", i);
return 0;
}
break;
default:
break;
}
}
return flag;
}
一开始只想着进行() [] {}相互之间的匹配,当输入{(){}}的时候,出现了false结果,原因是没有考虑到{()}[]这种输入。具体见代码部分的Print函数。
去看了一下官方的实现原理,使用的是栈的理念,遇见左括号就把它放到栈里面,遇见相匹配的右括号就把栈里面存的左括号取出,最后判断栈是否为空即可。
当前阶段只有C的实现,还有C++的实现要研究一下栈stack怎么使用。