🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
作者:Grey
原文地址:单词搜索系列问题
总体思路是:枚举从board的每个位置开始,看能否走出给定的单词,伪代码如下:
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (p(i, j, 0, str, board)) {
return true;
}
}
}
递归函数p
表示从board[i][j]
开始,能否走出str从0位置开始到最后的字符串。如果有任意一个路径满足条件,直接返回true即可。递归函数p
的base case是:
public static boolean p(int i, int j, int index, char[] str, char[][] board) {
if (index == str.length) {
return true;
}
if (i >= board.length || j >= board[0].length || i < 0 || j < 0 ) {
return false;
}
if (board[i][j] == '0') {
return false;
}
......
}
第一个if表示,如果index已经到str结尾了,说明我已经完成了str的完全匹配,直接返回true即可。
第二个if表示,如果index还没到str的结尾位置,但是i,j位置越界了,说明我的决策有问题,直接返回false。
第三个if表示,如果我当前的位置是曾经走过的位置,返回false。(因为我们为了防止走回头路,将走过的位置都标识为了0字符)
经过三个if,就是主要逻辑:
public static boolean p(int i, int j, int index, char[] str, char[][] board) {
.......
char c = board[i][j];
board[i][j] = '0';
if (str[index] == c) {
boolean p1 = p(i + 1, j, index + 1, str, board);
if (p1) {
board[i][j] = c;
return true;
}
boolean p2 = p(i, j + 1, index + 1, str, board);
if (p2) {
board[i][j] = c;
return true;
}
boolean p3 = p(i - 1, j, index