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

每日一题---单词搜索(深搜)

单词搜索

给出一个二维字符数组和一个单词,判断单词是否在数组中出现,

单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。

数据范围:

0 < 行长度 <= 100

0 < 列长度 <= 100

0 < 单词长度 <= 1000

回溯/深搜

深度优先搜索,我们定义这样一种搜索顺序,即先枚举单词的起点,然后依次枚举单词的每个字母。在这个过程中需要将已经使用过的字母改成一个特殊字母,以避免重复使用字符。

在主函数中两层循环遍历整个二维数组,找出所有满足等于单词第一个字符的,然后创建一个深搜函数,把这个节点的下标.以及第几个字母传入dfs函数,这个函数用于判断单词是否在二维数组中.

dfs函数的函数头:boolean dfs(String[] board, int i, int j, int pos)

//pos是记录搜索到哪个字母了

函数体:从传入的结点开始向四周搜索(可以借助偏移数组)

同时,对搜索过的坐标进行标记,避免重复搜索

如果满足不越界,没判断过且等于对应单词字符,就递归下一个

所有都满足就返回true,反之返回false

结束条件:搜索到单词的最后一个字符

注意:可以将一些函数中用到的数据定义为全局变量,减少参数传递

时间复杂度:单词起点一共有 n2个,单词的每个字母一共有上下左右四个方向可以选择,但由于不能走回头路,所以除了单词首字母外,仅有三种选择。所以总时间复杂度是 O(n2·3k)。 

代码:

import java.util.*;
public class Solution {
    int m, n;
    int[] dx = {0, 0, 1, -1};//偏移数组
    int[] dy = {1, -1, 0, 0};
    char[] word = {};
    boolean[][] ans;//用于标记是否已经搜索


    public boolean exist (String[] board, String _word) {
        word = _word.toCharArray();
        m = board.length;
        n = board[0].length();
        ans = new boolean[m][n];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(word[0] == board[i].charAt(j)) {//遍历所有字母
                    if(dfs(board, i, j, 0) == true) return true;
                }
            }
        }
        return false;
    }
    public boolean dfs(String[] board, int i, int j, int pos) {
        if(pos == word.length-1) {//pos是记录搜索到哪个字母了
            return true;
        }
        ans[i][j] = true;//标记以搜索
        for(int a = 0; a < 4; a++) {//上下左右搜索
            int x = i + dx[a];
            int y = j + dy[a];
            if(x < m && x >= 0 && y < n && y >= 0 && !ans[x][y] && 
            board[x].charAt(y) == word[pos+1]) {//没搜索过且字母相等
                if(dfs(board, x, y, pos+1)) return true;
            }
        }
        ans[i][j] = false;//走到这里说没搜到,更改标记为未搜
        return false;
    }
}

 

相关文章:

  • 本地化部署Deepseek关于Ollama 安全加固方案(新手易学)
  • 基于SpringBoot实现旅游酒店平台功能十六
  • element 的tab怎么动态根据参数值添加一个vue页面
  • UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法
  • C#的简单工厂模式、工厂方法模式、抽象工厂模式
  • C语言中关于数组和指针的重点知识
  • Hive SQL 精进系列:PERCENTILE_APPROX 搞定分位数
  • Android Dagger2 框架辅助工具模块深度剖析(六)
  • 运维工具推荐 -- 宝塔面板:一键部署服务器
  • Blender-MCP服务源码5-BlenderSocket插件安装
  • SOME/IP:用Python实现协议订阅、Offer、订阅ACK与报文接收
  • 《Python实战进阶》No24: PyAutoGUI 实现桌面自动化
  • 玩转ChatGPT:Claude 3.7 Sonnet进行数据分析(ARIMA)
  • 深度学习/机器学习毕业设计选题清单:热点课题与方向
  • Python之if语句
  • Freertos--把队列加入队列集
  • JumpServer基础功能介绍演示
  • Flexus应用服务器L实例、X实例以及ECS(弹性计算服务)之间的区别及其适用场景
  • PostgreSQL数据库版本支持策略
  • C++ STL算法函数 —— 应用及其操作实现
  • 澎湃读报丨解放日报8个版聚焦:牢记嘱托,砥砺奋进
  • 美参议院通过新任美国驻华大使任命,外交部回应
  • 浙商银行外部监事高强无法履职:已被查,曾任建行浙江省分行行长
  • 上海市十六届人大常委会第二十一次会议表决通过有关人事任免事项
  • 海尔·2025青岛马拉松两选手被终身禁赛:违规转让号码、穿戴他人号码
  • 国家统计局:一季度全国规模以上文化及相关产业企业营业收入增长6.2%