一つ、問題
1.説明
文字列のすべての文字を含むパスがマトリックスにあるかどうかを判断する関数を設計してください。パスはマトリックス内の任意のグリッドから開始でき、各ステップで1つのグリッドをマトリックス内で左、右、上、下に移動できます。パスがマトリックスのグリッドを通過する場合、パスはグリッドに再び入ることはできません。たとえば、次の3×4マトリックスには、文字列「bfce」のパスが含まれています(パス内の文字は太字でマークされています)。
[["a"、 " b "、 "c"、 "e"]、
[「s」、「f」、「c」、「s」]、
[「a」、「d」、「e」、「e」]]
ただし、文字列の最初の文字bが行列の最初の行の2番目のグリッドを占めた後、パスはこのグリッドに再び入ることができないため、マトリックスには文字列「abfb」のパスが含まれていません。
2.例
入力:board = [["A"、 "B"、 "C"、 "E"]、["S"、 "F"、 "C"、 "S"]、["A"、 "D"、 "E"、 "E"]]、word = "ABCCED"
出力:true
入力:board = [["a"、 "b"]、["c"、 "d"]]、word = "abcd"
出力:false
二、解決策
1.時間の複雑さはO(MN)です
2.スペースの複雑さO(K)
package com.haoxiansheng.demo01.SwordfingerOffer;
import lombok.extern.slf4j.Slf4j;
/**
* @author flame
* @data 2020/10/25
*/
@Slf4j
public class DFSDemo {
public static void main(String[] args) {
char[][] test = {
{
'a', 'b', 'c', 'e'}, {
's', 'f', 'c', 's'}, {
'a', 'd', 'e', 'e'}};
String word = "bfce";
log.info("DFS=>{}", exist(test, word));
}
public static boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++ ) {
if (dfs(board, words, i, j, 0)) {
return true;
}
}
}
return false;
}
public static boolean dfs(char[][] board, char[] word, int i, int j, int k) {
boolean isIf = i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k];
if (isIf) {
return false;
}
if (k == word.length - 1) {
return true;
}
char tmp = board[i][j];
board[i][j] = '/';
boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i, j - 1, k + 1);
board[i][j] = tmp;
return res;
}
}