给定一个只包括 '(',')','{','}','[',']'
的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序
闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
刚开始的时候…我没有认真看示例四。单纯以为是只要后面有对应匹配的,就行。
后来拿去LeetCode编译时给我报错了。
完了吧、其实这也没完全实现可以对应匹配
我刚开始的思路就是:
如果长度为1,那肯定没得匹配直接结束
如果长度>1,就分三种情况找,假设你刚开始就出现个右括号,那肯定也是匹配不了的。就先找右括号在有左括号的前提下的时候的位置
大概思路就这样吧…好扯淡…
function fg(s){
var i = 0;
if (s.length === 1) {
return false;
} else {
while (i < s.length) {
var flag = 0;
while (s[i] === "{" && i < s.length) {
if (s.indexOf("}") === -1) {
return false;
}
i++;
flag = 1;
}//"{" while
while (s[i] === "(" && i < s.length) {
if (s.indexOf(")") === -1) {
return false;
}
i++;
flag = 1;
}//"(" while
while (s[i] === "[" && i < s.length) {
if (s.indexOf("]") === -1) {
return false;
}
i++;
flag = 1;
}//"[" while
}
if (flag === 1) {
return true;
} else
return false;
}
}
后来改成使用栈的模式来解决:
刚开始如果碰到左括号就入栈,一旦有右括号要进来时,先判断栈尾元素是否和它匹配。如果匹配直接栈尾元素出栈,一旦不匹配就要结束函数了
这里栈我使用数组来代替的
如果最后这个数组为空、也就是栈空、则说明全部都匹配完了,自然而然是返回true。否则为false
function IsValid(s) {
var StackArr=[];
for(var i=0;i<s.length;i++){
if(s[i]==="["||s[i]==="{"||s[i]==="("){//如果是左括号就入栈
StackArr.push(s[i]);
}else if(s[i]==="]") {//如果是右括号,就判断是否匹配
if(s[i]===StackArr[StackArr.length-1]){
StackArr.pop();
}else
return false;//如果不匹配,就结束函数
}else if(s[i]==="}"){
if(s[i]===StackArr[StackArr.length-1]){
StackArr.pop();
}else
return false;
}else if(s[i]===")"){
if(s[i]===StackArr[StackArr.length-1]){
StackArr.pop();
}else
return false;
}
}
if(StackArr.length===0){
return true;//如果最后StackArr长度为0,说明全部匹配完了
}else
return false;
}
最后在leetcode上运行是这样的:
……还行吧……目前我也就只能这样了