力扣OJ|力扣OJ 剑指 Offer 12. 矩阵中的路径
题目:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
【力扣OJ|力扣OJ 剑指 Offer 12. 矩阵中的路径】代码:
int flatRow[4] = { 0, -1, 0, 1 };
int flatCol[4] = { 1, 0, -1, 0 };
bool existFromPointS(char** board, int boardSize, int* boardColSize, char * word,int rowS,int colS){
if (word[0] == '\0'){
return true;
//word已经匹配完所有字符
}
if (rowS < 0 || rowS >= boardSize || colS < 0 || colS >= *boardColSize){
return false;
//越界
}
if (board[rowS][colS] != word[0]){
return false;
//匹配当前字符
}
board[rowS][colS] = '\0';
//赋值为word中肯定没有的字符,保证不被重用
int i;
for (i = 0;
i < 4;
i++){
if (existFromPointS(board, boardSize, boardColSize, word + 1, rowS + flatRow[i], colS + flatCol[i])){
return true;
}
}
board[rowS][colS] = word[0];
//复原,回溯
return false;
}bool exist(char** board, int boardSize, int* boardColSize, char * word){
int row, col;
for (row = 0;
row < boardSize;
row++){
for (col = 0;
col < *boardColSize;
col++){
if (existFromPointS(board, boardSize, boardColSize, word, row, col)){
return true;
}
}
}
return false;
}
PS:
不得不说参数的意思只能靠猜,boardSize是board的行数,*boardColSize是board的列数
推荐阅读
- 剑指|剑指 Offer 13. 机器人的运动范围(dfs,bfs)
- 数据结构与算法|【算法】力扣第 266场周赛
- leetcode|今天开始记录自己的力扣之路
- 剑指offer60.n个骰子的点数
- 剑指offer——最小的K个数
- Android|年后备战金三银四(Android面试吃透这一篇就没有拿不到的offer......)
- 剑指黄昏
- 剑指offer15.二进制中1的个数
- java|阿里工作8年,肝到P8就剩这份学习笔记了,已助朋友拿到10个Offer
- 字节前端面试经验(已拿到offer)