/*******************************/
题目:给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
/*******************************/
/*******************************/
算法:本题可以考虑使用栈的数据结构来实现。首先,当字符串长度为奇数时,可以直接返回该括号无效。其次可以这样,取出字符串中的一个字符若为左括号则让其进栈;若为右括号则将栈顶元素与所取的元素比较,若为有效括号则让栈顶元素出栈。一直循环,直到所有字符被遍历完成。循环结束之后,如果栈元
素为空则表明此括号为有效括号,反之则无效。
/*******************************/
代码:
bool isValid(char* s) { int i, len, index = 0; /*len记录字符串长度*/ char cur, peak; /*为进栈元素和栈顶元素*/
len = strlen(s); if (len % 2 != 0) return false; char *stack = malloc(len / 2); /*定义一个大小为len/2的栈*/ for (i = 0; i < len ; i++) { cur = *s; /*先将左括号进栈*/ if (cur == '(' || cur == '{' || cur == '[') { stack[index++] = cur; } else { peak = stack[index - 1]; if (peak == '('&&cur == ')' || peak == '{'&&cur == '}' || cur == ']'&&peak == '[') { index--; } } s++; } if (index != 0) return false; else return true; }
/*欢迎大家评论和提问,也可以加QQ:1390644540讨论*/