BacktrackingQuestions
Contents
- 10 Regular Expression Matching
- 17 Letter Combinations of a Phone Number
- 22 Generate Parentheses
- 46 Permutations
- 89 Gray Code
- 79 Word Search
- 140 Word Break II
- 78 N-Queens
- 37 Sudoku Solver
- 52 N-Queens II
- 93 Restore IP Addresses
- 131 Palindrome Partitioning
- 44 Wildcard Matching
- 60 Permutation Sequence
- 212 Word Search II
- 216 Combination Sum III
- 47 Permutations II
- 357 Count Numbers with Unique Digits
- 90 Subsets II
- 291 Word Pattern II
- 320 Generalized Abbreviation
- 401 Binary Watch
- 40 Combination Sum II
- 211 Add and Search Word - Data structure design
- 254 Factor Combinations
- 267 Palindrome Permutation II
- 351 Android Unlock Patterns
- 294 filp games II
- 526 Beautiful Arrangement
17 Letter Combinations of a Phone Number
思路:先建立数字到字符的映射,然后回溯解决, 可以用map也可以用String 数组
|
|
22 Generate Parentheses
思路: 可以用回溯法或者模拟出栈的过程,可以了解下卡塔兰数
|
|
46 Permutations
思路: 每次都从第一个元素开始,然后判断是不是已经装进path里了.
|
|
89 Gray Code
思路: 有计算公式,也可以观察规律,每次都是从以后的数组的后面开始|一个(1<<i)
|
|
79 Word Search
思路: 就是四个方向分别去找,注意不能访问已经访问过的点
|
|
212 Word Search II
思路: 把这些words装进trie里,然后利用trie进行查找,主要注意的是dfs里的顺序。
|
|
140 Word Break II
思路: 递归,然后用dp来memorize。
|
|
51 N-Queens && 52
思路: 一个数组记录每行要选的是哪个
|
|
78 Subsets
思路: bitmap, dfs, iterative
|
|
37 sudoku solver
思路: 要用带boolean 的dfs去试探,注意的是判断合法的函数要对啊
|
|
93 Restore IP Addresses
思路: 一个一个检测,探测,leading zero的问题
|
|
131. Palindrome Partitioning
思路: 可以提前打表也可以后面判断isPalindrome
|
|
10 Regular Expression Matching
思路:递归或者是dp
public boolean isMatch(String s, String p) {
if(p.isEmpty())
return s.isEmpty();
if(p.length()==1)
return s.length()==1 && (s.equals(p)||p.charAt(0)=='.');
if(s.isEmpty())
return p.charAt(1)=='*' && isMatch(s,p.substring(2));
if(p.charAt(1)=='*'){
//replace 0 or one or more than one
return isMatch(s,p.substring(2))||((s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')&&isMatch(s.substring(1),p));
}else{
return (s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')&&isMatch(s.substring(1),p.substring(1));
}
}
public boolean isMatch(String s, String p) {
if(p.isEmpty())
return s.isEmpty();
int m= s.length(),n=p.length();
boolean [][]dp=new boolean[m+1][n+1];
dp[0][0]=true;
for(int i=2;i<=n;++i)
dp[0][i]=dp[0][i-2] && p.charAt(i-1)=='*';
for(int i=1;i<=m;++i){
if(i==1)
dp[i][1]=(s.charAt(i-1)==p.charAt(0))||p.charAt(0)=='.';
for(int j=2;j<=n;++j){
if(p.charAt(j-1)=='*'){
dp[i][j]=dp[i][j-2]||(s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)=='.') && dp[i-1][j];
}else{
dp[i][j]=(s.charAt(i-1)==p.charAt(j-1)||p.charAt(j-1)=='.')&&dp[i-1][j-1];
}
}
}
return dp[m][n];
}
Expectations
- 把dp里的滚动数组搞清楚,节省空间
- 探索下啤酒鱼怎么做。周末试了试煮鱼,好久没吃过鱼了,表示怀念。