20.有效的括号
解题思路一:
算法原理:
栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空;
遇到左括号入栈,遇到右括号和栈顶元素比较,若不匹配或栈空,直接返回0。
最后若栈非空,返回0,否则返回1。
算法图示:
{ | [ | ] | ( | } | { | } |
1 2 3 4 5 6 7
“{”先进栈,“[”进栈,随后“]”进栈,3与2匹配,则2,3出栈,匹配成功;随后“(”进栈,接着“)”,显然两括号无法匹配,匹配错误。
算法流程:
利用数组,构建顺序栈。
首先坚持字符串是否为空,若不为空则进行下一步,若为空则返回1;
初始化顺序栈(top=-1),利用for循环,在内部利用switch进行进栈出栈的判断。“{ [ (”均进栈,“) ] }”出栈判断。
算法代码:
bool isValid(char * s){
if(!s||s[0]=='\0')
return true;
char *stack=(char *)malloc(strlen(s));
memset(stack,0,strlen(s));//初始化内存空间
int top=-1;
int i;
for(i=0;s[i]!='\0';i++){
switch(s[i]){
case'(':
stack[++top]=s[i];
break;
case'{':
stack[++top]=s[i];
break;
case'[':
stack[++top]=s[i];
break;
case')':
if(top<0||stack[top--]!='(')
return false;
break;
case'}':
if(top<0||stack[top--]!='{')
return false;
break;
case']':
if(top<0||stack[top--]!='[')
return false;
break;
}
}
if(top>=0)
return false;
return true;
}
算法评价:
时间复杂度:O(n),空间复杂度O(n)
同样的代码,多次提交,而执行时间却不一样。为什么呢?