用javascript判断字符串括号是否匹配

    输入一个字符串,里面包含小括号,大括号,中括号,这个代码在市时间复杂度为n的情况下判断输入字符串是否合理.原题如下:

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.

解题思路如下:

1 先将字符串中的括号取出来放在数组a中,并将每一种括号的左部的位置记录在数组start里面

2 如果a的长度不是start长度的两倍,则返回false

3 考虑边界情况:如果没有左部,但是a的长度不为0,则返回false.

4 如果最右边的左括号的下一个字符不是和他匹配的右括号,则说明是false,如果匹配得上,则将左右括号划掉(即将相应的x数组置为0)

如果条件都符合,即是括号合法的字符

完整代码如下:

 var isValid = function(s) {
           var a=[];
           var l=s.length;
           var j=0;
           var flag=1;
           var start=[];
           var k=0;
           var x=[];
           //取出括号
           for(var i=0;i=0&&flag;i--){
                j=start[i];
                for(k=j+1;x[k]===0;k++){
                }//检测是否匹配
                if(a[j]+a[k]===10){
                    x[j]=0;
                    x[k]=0;
                }
                else {
                    flag=0;
                    break;
                }
            }

            if(flag===1){
                return true;
            }
            else {
                return false;
            }
        }

但是这个方法的运行时间比较久,我将数据存储和数据处理分开了,多了额外的时间开销,我在想,能不能在读入数据的时候处理呢?

改进的方法还是沿用这个思路,但是又有些不同:

我们都知道,最先出现的右括号肯定是和最后出现的左括号匹配.所以我们只要记录每个左括号出现的地方,每次一出现右括号,就和最后的左括号匹配,如果匹配得上,则将这两个左右括号消掉,如果匹配不上则说明这个字符串是不合法的.如果最后记录左括号的数组都消完了,那么字符串就是合法的,否则是不合法的.具体代码如下:

var isValid = function(s) {
            var a=[];//存储左括号出现的地方
            var l=s.length;
            var k=0;
            var flag=1;
            for(var i=0;i

这样,将数据存储和数据处理结合起来之后,节省了不少运行时间.

两次运行时间对比:

        用javascript判断字符串括号是否匹配_第1张图片

用javascript判断字符串括号是否匹配_第2张图片


你可能感兴趣的:(javascript)