当前位置: 首页 > news >正文

字符矩阵内单词搜索

单词搜索

问题链接:word search!!!
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

示例 1:
在这里插入图片描述

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:
在这里插入图片描述

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:
在这里插入图片描述

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

解题思路

深度优先搜索:先找到方格中字符串的开头字符,然后进行深度优先搜索算法,判断是否能够搜索到长度达到指定word长度的字符串。

代码样例

int x[4]={0,1,0,-1},y[4]={1,0,-1,0};
bool dfs(vector<vector<char>>& board,vector<vector<bool>>& used,string& word,int index,int i,int j){
    if(index>=word.length()){
        return true;
    }
    int m=board.size(),n=board[0].size();
    bool temp=false;
    for(int orient=0;orient<4;orient++){
        int _x=i+x[orient],_y=j+y[orient];
        if(_x<0||_x>=m||_y<0||_y>=n){
            continue;
        }
        if(!used[_x][_y]&&board[_x][_y]==word[index]){
            used[_x][_y]=true;
            temp=dfs(board,used,word,index+1,_x,_y);
            if(temp){
                break;
            }
            used[_x][_y]=false;
        }
    }
    return temp;
}
bool exist(vector<vector<char>>& board, string word) {
    int m=board.size(),n=board[0].size();
    vector<vector<bool>> used(m,vector<bool>(n));
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(board[i][j]==word[0]){
                used[i][j]=true;
                bool temp=dfs(board,used,word,1,i,j);
                if(temp){
                    return true;
                }
                used[i][j]=false;
            }
        }
    }
    return false;
}

代码分析
深度优先搜索算法的退出条件、继续搜索条件和边界条件。

//1
if(index>=word.length()){
	return true;
}
//2
if(!used[_x][_y]&&board[_x][_y]==word[index]){
//3
int _x=i+x[orient],_y=j+y[orient];
if(_x<0||_x>=m||_y<0||_y>=n){
    continue;
}

这里在定义深度优先搜索函数时需要注意传值传引用的区别,这样是对board、used、word等变量进行传引用bool dfs(vector<vector<char>>& board,vector<vector<bool>>& used,string& word,int index,int i,int j)。如果将其改成传值的形式(bool dfs(vector<vector<char>> board,vector<vector<bool>> used,string word,int index,int i,int j))会导致算法超时,难以在限制的时间内执行完测试样例。
按照以上算法可以击败大多数人的提交程序。
在这里插入图片描述

相关文章:

  • 网站说服力营销型网站策划/关于网络推广的方法
  • 重庆渝网站建设/seo范畴
  • 新东方研学网站那家公司做的/seo是搜索引擎营销
  • 外贸网站怎么做促销/搜索引擎外部链接优化
  • 广告公司做的网站图片侵权/如何查询百度收录情况
  • 企业网站建设公司有哪些/友链交换平台
  • C语言经典100例(027,028,029,030)
  • 虚拟机本地搭建Hadoop集群教程
  • 基于A*搜索和深度优先搜索解迷宫问题
  • RPC框架泛调用原理及转转的实践
  • 文档管理系统采用电子签名的优势
  • 单网口ubuntu主机配置virt-manager传统桥接bridge网络
  • 搜索——P5194 [USACO05DEC]Scales S+P5440 【XR-2】奇迹+P1378 油滴扩展
  • VueRouter编程式路由导航
  • 研一寒假C++复习笔记--程序的内存模型
  • CAD软件中如何标注曲线长度?
  • Vue CLI脚手架
  • vue3组件库项目学习笔记(四):发布你的组件