单词搜索
Posted onlyandonly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单词搜索相关的知识,希望对你有一定的参考价值。
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [ [‘A‘,‘B‘,‘C‘,‘E‘], [‘S‘,‘F‘,‘C‘,‘S‘], [‘A‘,‘D‘,‘E‘,‘E‘] ] 给定 word = "ABCCED", 返回 true. 给定 word = "SEE", 返回 true. 给定 word = "ABCB", 返回 false.
一开始只写了向四周搜索的递归,但是哪有那么简单。。由于正确的路径每个方向都有可能,所以需要用到回溯,即完成某个点后面的递归,要把它重新设为未访问过。
void search(char** board,char* word,int** visited,int index,int x,int y,int row,int col,int n,bool* flag) { if(index==n) { *flag=true; return ; } if(x<0||y<0||x==row||y==col||visited[x][y]||board[x][y]!=word[index]||*flag) return; visited[x][y]=1; search(board,word,visited,index+1,x+1,y,row,col,n,flag); search(board,word,visited,index+1,x-1,y,row,col,n,flag); search(board,word,visited,index+1,x,y+1,row,col,n,flag); search(board,word,visited,index+1,x,y-1,row,col,n,flag); visited[x][y]=0; } bool exist(char** board, int boardRowSize, int boardColSize, char* word) { int i,j,n=strlen(word); bool flag=false; int **visited=(int **)malloc(sizeof(int *)*boardRowSize); for(i=0;i<boardRowSize;i++) visited[i]=(int *)malloc(sizeof(int)*boardColSize); for(i=0;i<boardRowSize;i++) for(j=0;j<boardColSize;j++) visited[i][j]=0; for(i=0;i<boardRowSize;i++) for(j=0;j<boardColSize;j++) { if(board[i][j]==word[0]) { search(board,word,visited,0,i,j,boardRowSize,boardColSize,n,&flag); if(flag) return flag; } } return flag; }
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [ [‘A‘,‘B‘,‘C‘,‘E‘], [‘S‘,‘F‘,‘C‘,‘S‘], [‘A‘,‘D‘,‘E‘,‘E‘] ] 给定 word = "ABCCED", 返回 true. 给定 word = "SEE", 返回 true. 给定 word = "ABCB", 返回 false.
以上是关于单词搜索的主要内容,如果未能解决你的问题,请参考以下文章
片段(Java) | 机试题+算法思路+考点+代码解析 2023
编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。(代码片段