class Solution {
int left; //左括号
int right; //右括号
List<String> res;
void dfs(int l, int r, StringBuilder sb) {
if(l==0&&r==0) {
res.add(sb.toString());
return ;
}
if(l>0) {
sb.append('(');
dfs(l-1, r, sb);
sb.deleteCharAt(sb.length()-1);
}
//剩余的左括号也要少于右括号才能形成完整的括号
if(r>0&&l<r) {
sb.append(')');
dfs(l, r-1, sb);
sb.deleteCharAt(sb.length()-1);
}
}
public List<String> generateParenthesis(int n) {
left=n;
right=n;
res = new ArrayList<>();
dfs(left, right, new StringBuilder());
return res;
}
}
class Solution {
int n;
int m;
boolean[][] visited;
boolean dfs(int x, int y, char[][] board, String word, int t) {
// 先检查是否越界或已访问
if (x < 0 || x >= n || y < 0 || y >= m || visited[x][y]) {
return false;
}
// 检查当前字符是否匹配
if (board[x][y] != word.charAt(t)) {
return false;
}
// 如果已经匹配到最后一个字符
if(t==word.length()-1) {
return true;
}
visited[x][y]=true;
// 向四个方向搜索(注意:题目只允许上下左右,不是8个方向!)
boolean found =
dfs(x + 1, y, board, word, t + 1) ||
dfs(x - 1, y, board, word, t + 1) ||
dfs(x, y + 1, board, word, t + 1) ||
dfs(x, y - 1, board, word, t + 1);
//恢复现场
visited[x][y]=false;
return found;
}
public boolean exist(char[][] board, String word) {
n = board.length;
m = board[0].length;
visited = new boolean[n][m];
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(board[i][j]==word.charAt(0)) {
if(dfs(i, j, board, word, 0)) {
return true;
}
}
}
}
return false;
}
}