zoukankan      html  css  js  c++  java
  • 回溯法

    给定一个二维网格和一个单词,找出该单词是否存在于网格中。

    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    示例:

    board =
    [
    ['A','B','C','E'],
    ['S','F','C','S'],
    ['A','D','E','E']
    ]

    给定 word = "ABCCED", 返回 true.
    给定 word = "SEE", 返回 true.
    给定 word = "ABCB", 返回 false.

    解答:

     1 public class Solution {
     2 
     3     public static boolean exist(char[][] board, String word) {
     4         if(word.length() > board.length*board[0].length()) {
     5             return false;
     6         }
     7 
     8         boolean[][] boardFlag = new boolean[board.length][board[0].length];
     9         for(int i = 0; i < board.length; i++) {
    10             for(int j = 0; j < board[0].length; j++) {
    11                 if(find(i, j, board, word, boardFlag)) {
    12                     return true;
    13                 }
    14             }
    15         }
    16 
    17         return false;
    18     }
    19 
    20     public static boolean find(int i, int j, char[][] board, String word, boolean[][] boardFlag) {
    21         if(board[i][j] == word.charAt(0) && !boardFlag[i][j]) {
    22 
    23             boardFlag[i][j] = true;
    24 
    25             if(word.length-1 == 0) {
    26                 return true;
    27             }
    28 
    29             if(j + 1 < board[0].length) {
    30                 if(find(i,j+1,board,word.substring(1,word.length()),boardFlag)) return true;
    31             }
    32 
    33             if(j - 1 >= 0) {
    34                 if(find(i,j-1,board,word.substring(1,word.length()),boardFlag)) return true;
    35             }
    36 
    37             if (i+1 < board.length) {
    38                 if(find(i+1,j,board,word.substring(1,word.length()),boardFlag)) return true;  
    39             }
    40                 
    41             if (i-1 >= 0) {
    42                 if(find(i-1,j,board,word.substring(1,word.length()),boardFlag)) return true;  
    43             }
    44 
    45             // important here
    46             boardFlag[i][j] = false;
    47 
    48             return false;
    49         }
    50     }
    51 }

     

  • 相关阅读:
    Medium | LeetCode 142. 环形链表 II
    Easy | LeetCode 141. 环形链表
    Hard | LeetCode 23. 合并K个升序链表 | 分治 | 优先队列
    std(19)内置算法find find_if
    stl(18)内置算法for_each transform
    C++引用和指针比较 指针常量和常量指针
    #pragma once和#ifndef用法
    c++变量的一些注意点 extern关键字的使用
    比特 字节 地址 类型 编码 32位 64位
    stl(16)stl内置的一些函数对象
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10466754.html
Copyright © 2011-2022 走看看