• leetcode-单词探索


    单词搜索
     
     

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

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

    示例:

    board =
    [
      ['A','B','C','E'],
      ['S','F','C','S'],
      ['A','D','E','E']
    ]
    
    给定 word = "ABCCED", 返回 true.
    给定 word = "SEE", 返回 true.
    给定 word = "ABCB", 返回 false.

    思路:回溯算法,返回false的条件是探索到达了边界,已经探索过了,探索的字母与给定字符串的字符不相等。 

    探索是向上下左右探索,因此有四个回溯(bcakTrace())。

    class Solution {
        public boolean exist(char[][] board, String word) {
            int rows=board.length; //
            int cols=board[0].length;
            boolean res=false;
            boolean[][] mark=new boolean[rows][cols];
            for(int i=0;i<rows;i++){
                for(int j=0;j<cols;j++){
                    if(word.charAt(0)==board[i][j]){            //先找到字符串的起点
                        res=backTrace(0,word,board,i,j ,mark );
                        if(res==true)return true;
                    }
                }
            }
            return false;
        }
      public boolean backTrace(int index,String word,char[][] board,int row,int col,boolean[][] mark){
          if(index==word.length())return true;          //回溯的边界条件
          if(row>=board.length||row<0||col>=board[0].length||col<0)return false;
          if(mark[row][col]==true||word.charAt(index)!=board[row][col])return false;
          mark[row][col]=true;
          if(backTrace(index+1,word,board,row+1,col,mark)||
            backTrace(index+1,word,board,row-1,col,mark)||
            backTrace(index+1,word,board,row,col+1,mark)||
            backTrace(index+1,word,board,row,col-1,mark))
              return true;
          mark[row][col]=false;                 //每次探索至边界,不成立时,都要将标记清除
          return false;
      }
        }
  • 相关阅读:
    网页布局色块
    多物体运动
    elasticsearch基础命令
    mysiam,innodb
    git常用命令
    redis内存淘汰机制
    PHP运行模式
    MySQL主从延迟
    ip、uv、pv
    缓存出现的几种情况
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9533656.html
Copyright © 2020-2023  润新知