关于括号的几个题目

2021-03-08  本文已影响0人  啊磊11

1、括号有效性的题目一个字符串只有[]{}()这三种组合而成,判断是否是闭合有效的。

     看到这个首先想到的就是使用栈这种数据结构,闭合有效就对应元素入栈出栈。  

public static boolean isValid(String s){

                    HashMap charmap =new HashMap<>();

                    charmap.put('(',')');

                    charmap.put('[',']');

                    charmap.put('{','}');

                    Stack stack =new Stack();

                    for(int i =0;i<s.length();i++){

                        if(charmap.containsKey(s.charAt(i))){

                        stack.push(s.charAt(i));

                        continue;

                            }

                        if( stack.isEmpty() || s.charAt(i) != charmap.get(stack.pop())){

                        return false;

                           }

                }

                    return stack.isEmpty();        

            }

2、使用n对'()'可以组成的闭合字符串有哪些。

这个题目使用回溯算法,关键在于有多少个( open 就要有多个close)去对应,最后的退出条件就是数量达到了n对

public ArrayList result =new ArrayList();//定义公共的返回结果集

public ArrayList<String> muchString(int n){

backtrace(n,new StringBuilder(),0,0);

return result;

}

public void backtrace(int n, StringBuilder sb,int open,int close){

     if (sb.length() == 2*n){

          result.add(sb.toString());

      }

        if(open < n){

        sb.append('(');

        backtrace(n,sb,open+1,close);

        sb.deleteCharAt(sb.length()-1);

        }

        if(open<close){
        sb.append(')');

        backtrace(n,sb,open,close+1);

        sb.deleteCharAt(sb.length()-1);

        }

}

3、最长有效闭合括号长度是多少。

这个题目使用动态规划,主要是dp数组的定位 在这里我们将dp[]数组定义为以s[i]结尾的有效闭合括号的长度。

public static int zuichang(String s){

        int[] dp =new int[s.length()];

        int max = Integer.MIN_VALUE;

        for(int i =1;i<s.length();i++){

                if(s.charAt(i) ==')'){

                    if(s.charAt(i-1) =='('){

                        if(i>2){

                            dp[i] = dp[i -2] +2;

                        }else{

                                dp[i] =2;

                            }

                        }else if (i-dp[i-1] >0 && s.charAt(i-dp[i-1] -1) =='('){

                        dp[i] = dp[i-1] + (i -dp[i-1] >1?dp[i -dp[i-1]-2]:0)  +2;

                        }

                    }

                    max = Math.max(max,dp[i]);

    }

return max;

}

上一篇 下一篇

猜你喜欢

热点阅读