題目描述
給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
給定 word = "ABCCED", 返回 true
給定 word = "SEE", 返回 true
給定 word = "ABCB", 返回 false
提示:
board 和 word 中只包含大寫和小寫英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/word-search
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
算法:
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
//方法一:
//1,將該題分解爲:給定座標[i,j],在二維網格中是否能夠匹配單詞,在二維網格中所有匹配第一個字母的位置匹配一次單詞
//2,如何在二維網格中匹配一個單詞,回溯法
//函數一:回溯法匹配單詞
bool backTrackExist(char** board, int iRowSize, int iColSize, int iRow, int iCol, char* word, char** pBFlag, int iStep)
{
bool bMatch = false;
int iWordLen = strlen(word);
//1,結束條件
if(iStep == iWordLen - 1)
{
return true;
}
//2,判定下一步是否有匹配單詞
pBFlag[iRow][iCol] = 1;
if ((iRow - 1 >= 0) && (pBFlag[iRow - 1][iCol] == 0) && (board[iRow - 1][iCol] == word[iStep + 1]))
{
//上匹配
bMatch = backTrackExist(board, iRowSize, iColSize, iRow - 1, iCol, word, pBFlag, iStep + 1);
if(bMatch) return bMatch;
}
if ((iCol + 1 < iColSize) && (pBFlag[iRow][iCol + 1] == 0) && (board[iRow][iCol + 1] == word[iStep + 1]))
{
//右匹配
bMatch = backTrackExist(board, iRowSize, iColSize, iRow, iCol + 1, word, pBFlag, iStep + 1);
if(bMatch) return bMatch;
}
if ((iRow + 1 < iRowSize) && (pBFlag[iRow + 1][iCol] == 0) && (board[iRow + 1][iCol] == word[iStep + 1]))
{
//下匹配
bMatch = backTrackExist(board, iRowSize, iColSize, iRow + 1, iCol, word, pBFlag, iStep + 1);
if(bMatch) return bMatch;
}
if ((iCol - 1 >= 0) && (pBFlag[iRow][iCol - 1] == 0) && (board[iRow][iCol - 1] == word[iStep + 1]))
{
//左匹配
bMatch = backTrackExist(board, iRowSize, iColSize, iRow, iCol - 1, word, pBFlag, iStep + 1);
if(bMatch) return bMatch;
}
//3,回溯處理
pBFlag[iRow][iCol] = 0;
return false;
}
bool exist(char** board, int boardSize, int* boardColSize, char * word){
int i = 0;
int j = 0;
int k = 0;
int iRow = boardSize;
int iCol = boardColSize[0];
bool bRet = false;
char** pBoardFlag = NULL;
if((NULL == board) || (NULL == word)) return false;
//1,初始化二維網格匹配標記數組
pBoardFlag = (char**)malloc(sizeof(char*) * iRow);
for(i = 0; i < iRow; i++)
{
pBoardFlag[i] = (char*)malloc(sizeof(char) * iCol);
}
//2,循環二維網格,尋找座標,進行匹配單詞
for(i = 0; i < iRow; i++)
{
for(j = 0; j < iCol; j++)
{
if (board[i][j] == word[0])
{
for(k = 0; k < iRow; k++)
{
memset(pBoardFlag[k], 0x00, sizeof(char) * iCol);
}
//3,給定座標[i,j],匹配單詞
bRet = backTrackExist(board, iRow, iCol, i, j, word, pBoardFlag, 0);
if (bRet) return bRet;
}
}
}
//4,釋放空間
for(k = 0; k < iRow; k++)
{
free(pBoardFlag[k]);
}
free(pBoardFlag);
return bRet;
}
/*
//函數二:給定座標[i, j],判定是否能夠匹配單詞
bool fixPointExist(char** board, int iRowSize, int iColSize, int iRow, int iCol, char* word){
int i = 0;
bool bRet = false;
char** pBoardFlag = NULL;
pBoardFlag = (char**)malloc(sizeof(char*) * iRowSize);
for(i = 0; i < iRowSize; i++)
{
pBoardFlag[i] = (char*)malloc(sizeof(char) * iColSize);
memset(pBoardFlag[i], 0x00, sizeof(char) * iColSize);
}
//回溯調用
bRet = backTrackExist(board, iRowSize, iColSize, iRow, iCol, word, pBoardFlag, 0);
for(i = 0; i < iRowSize; i++)
{
free(pBoardFlag[i]);
}
free(pBoardFlag);
return bRet;
}
bool exist(char** board, int boardSize, int* boardColSize, char * word){
int i = 0;
int j = 0;
int iRow = boardSize;
int iCol = boardColSize[0];
bool bRet = false;
if((NULL == board) || (NULL == word)) return false;
for(i = 0; i < iRow; i++)
{
for(j = 0; j < iCol; j++)
{
if (board[i][j] == word[0])
{
bRet = fixPointExist(board, iRow, iCol, i, j, word);
if (bRet) return bRet;
}
}
}
return bRet;
}
*/