LeetCode-Generate Parentheses & Letter Combinations of a Phone Number
2015-08-20 14:20
483 查看
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
回溯法,自己的解答
在cc150看到的解法:
比对下两者的不同:
我用了一个栈,主要受开始学数据结构的影响,自然而然想到用栈了,其实下面的一道题感觉实在用left, right两个指针模拟栈。
用了一个StringBuilder,而下面用了一个char数组,究其原因还是因为这个长度是一定的,肯定是一定的。
对比一道题的多种解题方法还是可以收获很多的,多品味一下!
根据这道题,可以同样解下面这道题。
Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
感觉用一个数组比StringBuffer好多了,因为可以减少回溯的那个步骤。
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
回溯法,自己的解答
public List<String> generateParenthesis(int n) { List<String> list = new ArrayList<String>(); dfs(list, new LinkedList<Character>(), new StringBuilder(), n, 0); return list; } private void dfs(List<String> list, LinkedList<Character> stack, StringBuilder sb, int n, int cnt) { if (cnt > n) return; else if (cnt == n && stack.isEmpty()) { list.add(new String(sb.toString())); } StringBuilder temp = new StringBuilder(sb); LinkedList<Character> stack1 = new LinkedList<Character>(stack); if (cnt < n) { sb.append('('); stack.push('('); dfs(list, stack, sb, n, cnt+1); } if (!stack1.isEmpty() && stack1.peek() == '(') { temp.append(')'); stack1.pop(); dfs(list, stack1, temp, n, cnt); } }
在cc150看到的解法:
public List<String> generateParenthesis(int n) { List<String> list = new ArrayList<String>(); dfs(list, n, n, new char[n*2], 0); return list; } private void dfs(List<String> list, int left, int right, char[] str, int index) { if (left < 0 || right < left) return; if (left == 0 && right == 0) { list.add(new String(str)); return; } if (left > 0) { str[index] = '('; dfs(list, left-1, right, str, index+1); } if (right > left) { str[index] = ')'; dfs(list, left, right-1, str, index+1); } }
比对下两者的不同:
我用了一个栈,主要受开始学数据结构的影响,自然而然想到用栈了,其实下面的一道题感觉实在用left, right两个指针模拟栈。
用了一个StringBuilder,而下面用了一个char数组,究其原因还是因为这个长度是一定的,肯定是一定的。
对比一道题的多种解题方法还是可以收获很多的,多品味一下!
根据这道题,可以同样解下面这道题。
Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
Input:Digit string "23" Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
private String[] table = {" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; public List<String> letterCombinations(String digits) { List<String> list = new ArrayList<String>(); if (digits == null || digits.length() == 0) return list; char[] str = digits.toCharArray(); dfs(list, str, new char[digits.length()], 0); return list; } private void dfs(List<String> list, char[] str, char[] ret, int index) { if (index == str.length) { list.add(new String(ret)); return; } for (char c : table[str[index]-'0'].toCharArray()) { ret[index] = c; dfs(list, str, ret, index+1); } }
感觉用一个数组比StringBuffer好多了,因为可以减少回溯的那个步骤。
相关文章推荐
- case when a>b then a else b
- 友盟社会化分享
- 【android】Fastboot命令详解
- skiplist 跳跃表详解及其编程实现
- iOS开发日记6-跳转appStore评分
- Monkey基础
- BA-Honeywell WEBsAX系统
- 记2015暑假大学生电子设计竞赛
- svn 无法连接主机, 无法加载或初始化请求的服务提供程序
- 如何抓取网页
- LeetCode96_Unique Binary Search Trees(求1到n这些节点可以组成多少种不同的二叉查找树) Java题解
- DWORD转CString
- NOI 2015 T1 等式
- 异步获取网络图片Bitmap
- 面向对象思想
- dynamic change content of bootstrap tooltip or popover
- Java的内存机制--知晓一二
- Jupiter代码审查工具使用参考
- 欧几里德与扩展欧几里德算法(转)
- IOS屏幕旋转