前言
###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
1.括号生成
题面:
基本分析: 这道题很经典的回溯题,通过观察我们可以发现,从左往右数,左括号的数量都大于或者等于右括号的数量,于是我们就可以定义一个递归函数,来执行此过程,当剩下的右括号数量为0时,就表示递归结束了
代码:
class Solution {
List<String> ans = new ArrayList<>();
int n;
public List<String> generateParenthesis(int n) {
this.n = n;
recursion(n,n,"");
return ans;
}
public void recursion(int lastleft,int lastright,String pre){
if(lastright==0){
ans.add(pre);
}
if(lastleft>0){
recursion(lastleft-1,lastright,pre+"(");
}
if(lastright>lastleft){
recursion(lastleft,lastright-1,pre+")");
}
}
}
2.单词搜索
题面:
分析:在主函数中,我们遍历这个二维数组,如果存在字符与单词的首字符相等,那我们就进入定义好的递归函数,并给这个首字符的位置打上标记,避免重复读取,自定义递归函数recursion,有三个参数,分别是x,y,count,分别表示上一个读取点的横纵坐标,和这次应该匹配word的第几个字符,我们以上一次的x,y作为出发点,分别判断上下左右的字符是否等于words[count],如果不等,就返回false,如果相等,就进入下一层递归,在此之前需要将点打上标记,出递归也别忘了将标记删除,递归结束的条件就是count等于word的长度
代码:
class Solution {
int n;
int m;
int[][] flag;
char[][] board;
char[] wrods;
int wlen;
public boolean exist(char[][] board, String word) {
this.board = board;
wrods = word.toCharArray();
wlen = wrods.length;
n = board.length;
m = board[0].length;
flag = new int[n][m];
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(board[i][j]==wrods[0]){
flag[i][j]=1;
boolean isTrue = recursion(i,j,1);
flag[i][j] = 0;
if(isTrue)return true;
}
}
}
return false;
}
public boolean recursion(int x,int y,int count){
if(count==wlen){
return true;
}
boolean ans = false;
if(x-1>=0&&board[x-1][y]==wrods[count]&&flag[x-1][y]!=1){
flag[x-1][y] = 1;
ans = recursion(x-1,y,count+1)||ans;
flag[x-1][y] = 0;
}
if(x+1<n&&board[x+1][y]==wrods[count]&&flag[x+1][y]!=1){
flag[x+1][y] = 1;
ans = recursion(x+1,y,count+1)||ans;
flag[x+1][y] = 0;
}
if(y-1>=0&&board[x][y-1]==wrods[count]&&flag[x][y-1]!=1){
flag[x][y-1] = 1;
ans = recursion(x,y-1,count+1)||ans;
flag[x][y-1] = 0;
}
if(y+1<m&&board[x][y+1]==wrods[count]&&flag[x][y+1]!=1){
flag[x][y+1] = 1;
ans = recursion(x,y+1,count+1)||ans;
flag[x][y+1] = 0;
}
return false||ans;
}
}
后言
上面是力扣Hot100的回溯专题,下一篇是其他专题的习题,希望有所帮助,一同进步,共勉!