image.png
LeetCode 17. 九键字母 3:30
LeetCode 79. 二维数组查找单词 17:27
LeetCode 49. 全排列 32:50
LeetCode 50. 全排列2 45:0
LeetCode 78. 子集 59:41
LeetCode 90. 子集2 68:03
LeetCode 216. 三个数的和 75:41
LeetCode 52.N皇后问题2 87:52
LeetCode 37.数独 103:46

17. 电话号码的字母组合

难度中等1114
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
DFS和回溯专题 - 图2

示例 1:
输入:digits = “23”
输出:[“ad”,”ae”,”af”,”bd”,”be”,”bf”,”cd”,”ce”,”cf”]

示例 2:
输入:digits = “”
输出:[]

示例 3:
输入:digits = “2”
输出:[“a”,”b”,”c”]
解法1:
image.png

  1. class Solution {
  2. public List<String> letterCombinations(String digits) {
  3. if(digits.isEmpty()) return new ArrayList<>();
  4. String[] map ={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
  5. List<String> states = new ArrayList<String>();
  6. states.add("");
  7. for(char u:digits.toCharArray()){
  8. List<String> now = new ArrayList<String>();
  9. for(char c:map[u-'2'].toCharArray())
  10. for(String s:states)
  11. now.add(s+c+"");
  12. states=now;
  13. }
  14. return states;
  15. }
  16. }

79. 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:
board =
[
[‘A’,’B’,’C’,’E’],
[‘S’,’F’,’C’,’S’],
[‘A’,’D’,’E’,’E’]
]

给定 word = “ABCCED“, 返回 true
给定 word = “SEE“, 返回 true
给定 word = “ABCB“, 返回 false

  1. class Solution {
  2. int n,m;
  3. int[] dx={-1,0,1,0},dy={0,1,0,-1};
  4. public boolean exist(char[][] board, String word) {
  5. if(board.length==0||board[0].length==0) return false;
  6. n=board.length;
  7. m=board[0].length;
  8. for(int i=0;i<n;i++)
  9. for(int j=0;j<m;j++)
  10. if(dfs(board,i,j,word,0))
  11. return true;
  12. return false;
  13. }
  14. public boolean dfs(char[][] board,int x,int y,String word,int u){
  15. if(board[x][y]!=word.charAt(u)) return false;
  16. if(u==word.length()-1) return true;
  17. board[x][y]='.';
  18. for(int i=0;i<4;i++){
  19. int a=x+dx[i],b=y+dy[i];
  20. if(a>=0&&a<n&&b>=0&&b<m)
  21. if(dfs(board,a,b,word,u+1))
  22. return true;
  23. }
  24. board[x][y]=word.charAt(u);
  25. return false;
  26. }
  27. }

46. 全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

  1. class Solution {
  2. int n;
  3. List<Integer> path=new ArrayList<>();
  4. List<List<Integer>> ans=new ArrayList<>();
  5. boolean[] st;
  6. public List<List<Integer>> permute(int[] nums) {
  7. n=nums.length;
  8. st=new boolean[n];
  9. dfs(nums,0);
  10. return ans;
  11. }
  12. void dfs(int[] nums,int u){
  13. if(u==n){
  14. ans.add(new ArrayList<>(path));
  15. return;
  16. }
  17. for(int i=0;i<n;i++){
  18. if(!st[i]){
  19. st[i]=true;
  20. path.add(nums[i]);
  21. dfs(nums,u+1);
  22. path.remove(path.size()-1);
  23. st[i]=false;
  24. }
  25. }
  26. }
  27. }

78. 子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:
输入:nums = [0]
输出:[[],[0]]
image.png

  1. class Solution {
  2. public List<List<Integer>> subsets(int[] nums) {
  3. List<List<Integer>> res=new ArrayList<>();
  4. for(int i=0;i<1<<nums.length;i++){
  5. List<Integer> now=new ArrayList<>();
  6. for(int j=0;j<nums.length;j++){
  7. if((i>>j&1)==1)
  8. now.add(nums[j]);
  9. }
  10. res.add(now);
  11. }
  12. return res;
  13. }
  14. }