第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; } }