当做到括号匹配的编程题时,大家第一反应就是利用压栈来进行括号的匹配,我也一样,创建一个数组充当栈,将左括号push进栈,遇到右括号进行栈的pop,括号是否匹配就看栈是否为空,是否当栈空时遇到右括号。
代码大致如下:
bool isValid(string s){
char s[100];
int top = 0;
for (int i = 0; i < s.length(); i++) {
if (top == 0 && s[i] == ')')
return false;
if (s[i] == '(')
s[top++] = ')';
if (s[i] == '(')
s[top--] = ')';
}
if (top == 0)
return true;
}
后面看了网上的括号的匹配代码后发现,其实我们利用栈也只是一直利用top的值,与栈中所存的值无关。所以利用这样的思想,可以将代码优化如以下代码:
bool isValid(string s){
int match = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(')
match++;
else if (s.charAt(i) == ')')
match--;
if (match < 0)
return false;
}
if (match == 0)
return true;
}
其中的match有类似于栈顶top的效果用于记录匹配数,减少了建栈的空间开销。