第79题:单词搜索

一. 问题描述

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

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

 

示例:

board =

[

  [‘A‘,‘B‘,‘C‘,‘E‘],

  [‘S‘,‘F‘,‘C‘,‘S‘],

  [‘A‘,‘D‘,‘E‘,‘E‘]

]

给定 word = "ABCCED", 返回 true.

给定 word = "SEE", 返回 true.

给定 word = "ABCB", 返回 false.

 

二. 解题思路

解题思路:本题采用回溯算法进行求解,递归函数(已经存储的字符串haveword,已经存储的最后一位的定位横坐标X,纵坐标y,标记后的整个数组board,目标值word)

步骤一:判断当前数值是否等于目标。是:返回true,不是,继续递归。

步骤二:对进行存储的数值要进行标记为1,防止重复使用。

 

三. 执行结果

执行用时 :47 ms, 在所有 java 提交中击败了9.38%的用户

内存消耗 :39.2 MB, 在所有 java 提交中击败了95.96%的用户

四. Java代码

class Solution {
    public boolean exist(char[][] board, String word) {
        for(int i=0;i<board.length;i++)
                for(int j=0;j<board[0].length;j++)
                {
                    if(board[i][j]==word.charAt(0))
                    {
                        String haveword=board[i][j]+"";
                        int x=i;
                        int y=j;
                        
                        char[][] aboard=new char[board.length][board[0].length];
                        for(int m=0;m<board.length;m++)
                            System.arraycopy(board[m], 0, aboard[m], 0, board[m].length);
                        aboard[x][y]=‘1‘;
                        boolean result=com(haveword,x,y,aboard,word);
                        if(result==true)
                        {
                            return true;
                        }
                        
                    }
                }
            
            return false;
    }
    
   public boolean com(String haveword, int x, int y,char[][] board,String word) {
        if(haveword.equals(word))
        {
            return true;
        }
        if(x-1>=0&&board[x-1][y]==word.charAt(haveword.length()))
        {
            String ahaveword=haveword+board[x-1][y];
            int x1=x-1;
            char[][] aboard=new char[board.length][board[0].length];
            for(int m=0;m<board.length;m++)
                System.arraycopy(board[m], 0, aboard[m], 0, board[m].length);
            aboard[x1][y]=‘1‘;
            boolean qa=com(ahaveword,x1,y,aboard,word);
            if(qa==true)
            return qa;
        }
        if(x+1<board.length&&board[x+1][y]==word.charAt(haveword.length()))
        {
            String ahaveword=haveword+board[x+1][y];
            int x1=x+1;
            char[][] aboard=new char[board.length][board[0].length];
            for(int m=0;m<board.length;m++)
                System.arraycopy(board[m], 0, aboard[m], 0, board[m].length);
            aboard[x1][y]=‘1‘;
            boolean qa=com(ahaveword,x1,y,aboard,word);
            if(qa==true)
            return qa;
        }
        if(y-1>=0&&board[x][y-1]==word.charAt(haveword.length()))
        {
            String ahaveword=haveword+board[x][y-1];
            int y1=y-1;
            char[][] aboard=new char[board.length][board[0].length];
            for(int m=0;m<board.length;m++)
                System.arraycopy(board[m], 0, aboard[m], 0, board[m].length);
            aboard[x][y1]=‘1‘;
            boolean qa=com(ahaveword,x,y1,aboard,word);
            if(qa==true)
            return qa;
            
        }
        if(board[0].length>0&&y+1<board[0].length&&board[x][y+1]==word.charAt(haveword.length()))
        {
            String ahaveword=haveword+board[x][y+1];
            int y1=y+1;
            char[][] aboard=new char[board.length][board[0].length];
            for(int m=0;m<board.length;m++)
                System.arraycopy(board[m], 0, aboard[m], 0, board[m].length);
            aboard[x][y1]=‘1‘;
            boolean qa=com(ahaveword,x,y1,aboard,word);
            if(qa==true)
            return qa;
            
        }
        return false;
        
    }
    
}
相关文章
相关标签/搜索