【Leetcode-022】括号生成(Java && C++实现)


1 回溯法(Java实现)

/*
    方法:回溯搜索算法 + 括号组合的性质
    难度:中等
    思路:括号组合问题的性质:
          (1)对于合法的括号组合,左括号数量【必等于】右括号数量
          (2)对于合法的括号组合的任意子串,左括号数量【应大于等于】右括号数量
    时间复杂度:
    空间复杂度:
    类似题目:t020-有效的括号
*/

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Solution {
    
    
    //结果集
    List<String> res = new ArrayList<>();
    //当前括号的选择
    char[] parenthesis = new char[]{
    
    '(', ')'};

    public List<String> generateParenthesis(int n) {
    
    
        if(n == 0) return res;

        //记录选择的路径
        StringBuilder track = new StringBuilder();
        //调用回溯函数
        backtrack(n,0, 0 ,track);
        return res;
    }

    //回溯函数
    //路径:track中记录的结果
    //选择列表:加入左括号或右括号
    //结束条件:左右括号数相等,均为n(构成n对括号)
    private void backtrack(int n, int left, int right, StringBuilder track) {
    
    
        //触发结束条件
        if(left == n && right == n){
    
    
            res.add(new String(track));
            return;
        }

        //【剪枝】排除无效情况1:右括号数量 大于 左括号数量
        if(left < right) return;
        //【剪枝】排除无效情况2:右括号数量或左括号数量大于n
        if(left > n || right > n) return;

        for(char ch : parenthesis){
    
    
            if(ch == '('){
    
      //当前为左括号
                //作出选择
                track.append(ch);
                //回溯 → 进入决策树的下一层
                backtrack(n, left + 1, right, track);
                //撤销选择
                track.deleteCharAt(track.length() - 1);
            }else if(ch == ')'){
    
        //当前为右括号
                //作出选择
                track.append(ch);
                //回溯 → 进入决策树的下一层
                backtrack(n, left, right + 1, track);
                //撤销选择
                track.deleteCharAt(track.length() - 1);
            }
        }
    }

    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Solution s = new Solution();
        List<String> res = s.generateParenthesis(n);
        System.out.println(res);
    }
}

2 回溯法(C++实现)-待更新

猜你喜欢

转载自blog.csdn.net/newson92/article/details/113811195