給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。
示例:
board =
[ ['a','b','c','e'],
['s','f','c','s'],
['a','d','e','e']
]給定 word = "abcced", 返回 true.
給定 word = "see", 返回 true.
給定 word = "abcb", 返回 false.
原題url:
拿到這題,我一開始想到的方法就是:
接下來看看**:
class solution }}
return false;
}public boolean dfs(int x, int y, int index, boolean used)
// 全部找完了
if (index == wordarray.length - 1)
// 設定當前格使用過了
used[x][y] = true;
// 尋找上下左右是否有符合下乙個的情況
// 上一格是否存在並且沒有被使用過
if (x > 0 && !used[x - 1][y])
}// 下一格是否存在並且沒有被使用過
if (x < row - 1 && !used[x + 1][y])
}// 左一格是否存在並且沒有被使用過
if (y > 0 && !used[x][y - 1])
}// 右一格是否存在並且沒有被使用過
if (y < col - 1 && !used[x][y + 1])
}// 上下左右的情況都走完了,因此回退,設定當前格沒有使用過
used[x][y] = false;
return false;}}
提交ok,執行用時:19 ms
,記憶體消耗:38.3 mb
。從時間上看起來還有不少優化的空間,那該怎麼做呢?
我看了別人更優的解法,發現思想都是一致的,只是在判斷上可能會更加簡潔一些,如果是判斷快速失敗的話,似乎沒有什麼本質上的區別。我將自己的寫法稍微優化了一下:
class solution }}
return false;
}public boolean dfs(int x, int y, int index, boolean used)
// 當前位置是否符合條件
if (board[x][y] != wordarray[index])
// 全部找完了
if (index == wordarray.length - 1)
// 設定當前格使用過了
used[x][y] = true;
// 尋找上下左右是否有符合下乙個的情況
boolean flag = dfs(x - 1, y, index + 1, used) || dfs(x + 1, y, index + 1, used) ||
dfs(x, y - 1, index + 1, used) || dfs(x, y + 1, index + 1, used);
// 上下左右的情況都走完了,因此回退,設定當前格沒有使用過
used[x][y] = false;
return flag;}}
提交ok,執行用時:5 ms
,記憶體消耗:38.4 mb
。用時上少了很多,應該在於判斷上:
以上就是這道題目我的解答過程了,不知道大家是否理解了。這道題主要就是回溯
,針對邊界情況需要注意,應該就沒有其他問題了。
力扣79 單詞搜尋
給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回 ...
力扣79 單詞搜尋
class solution return false public boolean existhelper char board,boolean used,char word,int idx,int col,int row if used row col true board row col wo...
力扣 79 單詞搜尋
題目 直接看劍指offer第六十五題矩陣中的路徑 給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a...