Um: solução para o problema
Não há habilidade neste tópico, é usar uma letra como centro e comparar recursivamente acima, abaixo, esquerda e direita.
Tempo: O (m * n * 3 ^ k), Espaço: O (m * n)
É um pouco estranho que no leetcode, o mesmo programa, o código Java possa passar, mas o código C ++ não possa passar. Mas ele pode passar perfeitamente no lintcode!, Indicando que o teste do leetcode ainda é um pouco problemático
Dois: exemplos de código completos (versão C ++ e versão Java)
C ++:
classe Solução { private : bool existe (vetor <vetor < char >> & board, vetor <vetor < bool >> visitado, int i, int j, int idx, cadeia de caracteres da palavra) { if (idx == word.length () ) retornar verdadeiro ; if (i < 0 || i> = board.size () || j < 0 || j> = board [ 0 ] .size () || visitou [i] [j] || board [i] [j ]! = palavra [idx]) retorna falso ; visitado [i] [j] =verdadeiro ; bool existiu = existe (quadro, visitado, i- 1 , j, idx + 1 , palavra) || existe (quadro, visitado, i + 1 , j, idx + 1 , palavra) || existe (quadro, visitado, i, j - 1 , idx + 1 , palavra) || existe (quadro, visitado, i, j + 1 , idx + 1 , palavra); visitado [i] [j] = falso ; retorno existia; } public : bool existe (vetor <vetor < char >> & board, stringpalavra) { if (board.size () == 0 || board [ 0 ] .size () == 0 ) retorna false ; int m = board.size (); int n = placa [ 0 ] .size (); vetor <vetor < bool >> visitado (m, vetor < bool > (n, false )); for ( int i = 0 ; i <m; i ++ ) for ( int j = 0 ; j <n; j ++ ) se(existe (quadro, visitado, i, j, 0 , palavra)) return true ; retornar falso ; } };
Java:
classe Solution { private boolean existe ( char [] [] board, boolean [] [] visitou, int i, int j, int idx, String word) { if (idx == word.length ()) retorna true ; if (i < 0 || i> = board.length || j < 0 || j> = board [ 0 ] .length || visitou [i] [j] || board [i] [j]! = word .charAt (idx)) retorna false ; visitado [i] [j] = verdadeiro ; booleano existia= existe (quadro, visitado, i- 1 , j, idx + 1 , palavra) || existe (quadro, visitado, i + 1 , j, idx + 1 , palavra) || existe (quadro, visitado, i, j - 1 , idx + 1 , palavra) || existe (quadro, visitado, i, j + 1 , idx + 1 , palavra); visitado [i] [j] = falso ; retorno existia; } public boolean existe ( char [] [] board, String word) { if (board == null|| board.length == 0 || quadro [ 0 ] == nulo || board [ 0 ] .length == 0 ) retorna false ; int m = comprimento da placa; int n = placa [ 0 ]. comprimento; booleano [] [] visitado = novo booleano [m] [n]; for ( int i = 0 ; i <m; i ++ ) for ( int j = 0 ; j <n; j ++ ) if (existir (fórum, visitado, i, j,0 , palavra)) retornar verdadeiro ; retornar falso ; } }