问题描述
给定一个只包括'(', ')' , '[' , ']' , '{' , '}'
的字符串,判断字符串时是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合
2.左括号必须以正确的顺序闭合。
3.空字符串可认为是有效字符串
样例
输入1:"()"
输出1:true
输入2:"()[]{}"
输出2:true
输入3:"([)]"
输出3:false
输入4:"(}"
输出4:false
输入5:"[])("
输出5:false
分析
输入字符串的有效性要求我们的算法必须对括号的顺序有识别能力,即:
1.相同类型的括号左括号要比右括号先出现,否则就要false
2.a类型的左括号出现后,b类型的右括号不得相邻出现,否则false
3.左括号得到正确类型的右括号匹配后,就可以释放该左括号
那就用栈来解决⑧!
另,需注意:
3.空字符串为有效字符串
4.结果为true的字符串,其长度必然模2为0
5.输入的字符串长度未知
实现
///括号匹配
/// <param name="s"></右括号>
/// <returns></returns左括号>
char MatesOfBracket(char s)
{
if (s == ')') {
return '(';
}
if (s == ']') {
return '[';
}
if (s == '}') {
return '{';
}
return '0';
}
/// </summary>字符串匹配问题
/// <param name="s"></param括号字符串>
/// <returns></returns 1:有效 0:无效>
int isValid(char* s) {
int n = strlen(s);
if (n % 2) {//字符串长为奇数不用判断,无效!
return 0;
}
char* stack = (char*)malloc((n + 1) * sizeof(char));//申请动态空间
int top = 0;
if (stack != NULL) {
for (int i = 0; i < n; i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {//入栈
stack[++top] = s[i];
}
else if (stack[top] == MatesOfBracket(s[i])) {//出栈
top--;
}
else {
return 0;
}
}
}
if (stack != NULL) {//释放空间
free(stack);
stack = NULL;
}
return top == 0;
}