學渣帶你刷Leetcode0079單詞搜索

題目描述

給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。

 

示例:

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;
}
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章