关于括号的几个题目

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;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • import java.util.*; /** 给定一个只包括 '(',')','{','}','[',']' 的...
    iamlyly阅读 262评论 0 0
  • 七.数组 1.给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返...
    寒江_d764阅读 357评论 0 0
  • 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需...
    Shimmer_阅读 241评论 0 1
  • java集合的方法:①Set<Character> set = new HashSet<>();②set.cont...
    皮蛋豆腐酱油阅读 275评论 0 2
  • 自己解法 括号匹配问题,第一想法就是使用栈,左括号入栈,遇到匹配的右括号出栈,如果中间有不符合的右括号,直接返回f...
    justonemoretry阅读 201评论 0 0

友情链接更多精彩内容