leetcode-22 Generate Parentheses



问题描述:Given n pairs of parentheses, write a function to generate allcombinations of well-formed parentheses.

For example, given n = 3, a solution setis:

"((()))","(()())", "(())()", "()(())", "()()()"

问题分析:

/* 此题可以类比于跳台阶问题

 * 初始状态:有(剩下)n个左括号Leftn个右括号Right

 * 当左括号数left < right时,既可以添加左括号,又可以添加右括号

 * left = right后,只能继续添加左括号

 * 即转化成状态转移方程:O(n,m) = O(n - 1, m) + O(n , m - 1)

 */

代码:

public class Solution {
    public List<String> generateParenthesis(int n) {
        
		List<String> result = new ArrayList<>();
		
		if(n > 0)
		{
			parenthesis(result, new String(), n , n);
		}
		
		return result;
    }
	
	//递归函数
	private void parenthesis(List<String> list, String str, int m, int n)
	{
		if(m == 0 && n == 0)
		{
			list.add(str.toString());
			return;
		}
		
		if(m != 0)
		{
			parenthesis(list, str + "(", m - 1, n);
		}
		//只有此一种情况可以添加右括号
		if(m < n && n != 0)
		{
			parenthesis(list, str + ")", m , n - 1);
		}
	}
}

/*上述递归算法的变种*/
public class Solution {  
    public ArrayList<String> generateParenthesis(int n) {  
        ArrayList<String> res = new ArrayList<String>();  
        generate(res, "", 0, 0, n);  
        return res;  
    }  
    public void generate(ArrayList<String> res, String tmp, int lhs, int rhs, int n)  
    {  
		//当已经有n个左括号时,这时就只有一种情况,剩下的全为右括号
        if(lhs == n)  
        {  
            for(int i = 0; i < n - rhs; i++)  
            {  
                tmp += ")";  
            }  
            res.add(tmp);  
            return ;  
        }  
        generate(res, tmp + "(", lhs + 1, rhs, n);  
        if(lhs > rhs)  
            generate(res, tmp + ")", lhs, rhs + 1, n);  
    }  
}



你可能感兴趣的:(leetcode-22 Generate Parentheses)