【剑指12】矩阵中的路径

方法一:模拟遍历矩阵:时间O( 3 k 3^{k} 3kmn),空间O(mn)

k:字符串长度,m、n:矩阵的长和宽

时间复杂度: 每个位置都有三个方向可以走(不能走回头路),因此时间 3 k 3^{k} 3k。矩阵的每个位置都应该检查是否正确,因此时间 m*n
题解:

  1. 遍历整个矩阵,若满足条件则模拟走上下左右位置,看是否有路径满足
  2. 不能走回头路,因此每次都把board中走过的路标记一下,在回溯的时候应该恢复上次状态
  3. 注意结束条件
class Solution {
    
    
public:
    bool Ritway(vector<vector<char>>& board, string& word, int i, int j, int index)
    {
    
    
        if (i < 0 || i == board.size() || j < 0 || j == board[0].size() || board[i][j] != word[index])
            return false;
        if (index == word.size() - 1)
            return true;
        // 关键就是这里设置已经走过的路径!!不需要新建一个board保存走过的路径,在原始棋盘上更改就行了
        board[i][j] = '\0';
        // 判断上下左右是否有正确路径
        bool flag = Ritway(board, word, i - 1, j, index + 1) ||
                    Ritway(board, word, i + 1, j, index + 1) ||
                    Ritway(board, word, i, j - 1, index + 1) ||
                    Ritway(board, word, i, j + 1, index + 1);
        // 在检测完该条路径之后,应该恢复原始棋盘的样子
        board[i][j] = word[index];
        return flag;
    }
    bool exist(vector<vector<char>>& board, string word) 
    {
    
    
        if (word.size() == 0)
            return false;
        for (int i = 0; i < board.size(); i++)
        {
    
    
            for (int j = 0; j < board[0].size(); j++)
            {
    
    
                if (Ritway(board, word, i, j, 0))
                {
    
    
                    return true;
                }
            }
        }
        return false;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_45691748/article/details/112478049