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

79. 单词搜索-极致优化,可行性剪枝和顺序剪枝

        给你一个目标字符串,和一个二维字符数组,判断在数组中是否能找到目标字符串。

                

        例如,board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"

算法思路

  1. 以每个单元格作为搜索起点,使用深度优先搜索(DFS)寻找可能匹配目标单词的路径

  2. DFS实现要点:

    • 终止条件:当匹配位置pos达到目标单词长度时,说明找到完整路径
    • 搜索过程:从当前位置向四个方向扩展,检查边界条件并进行回溯
    • 防重处理:在递归入口检查是否已访问,并验证当前字符是否匹配目标单词首字母
  3. 优化策略:

    • 可行性剪枝:若目标单词中某字符出现频率超过board中的总数,直接终止
    • 顺序优化:当目标单词尾字符出现频率低于首字符时,翻转单词可减少无效分支
      class Solution {
      public:static constexpr int dx[4] = {0,0,-1,1},dy[4] = {-1,1,0,0};bool dfs(int x,int y,int pos,string &word,int m,int n,vector<vector<char>>& board,vector<vector<int>>& vis) {if (pos == word.size()) {return true;}for (int i = 0;i < 4;i++) {int bx = dx[i] + x,by = dy[i] + y;if (bx < 0 || bx >= m || by < 0 || by >= n || board[bx][by] != word[pos] || vis[bx][by]) {continue;} vis[bx][by] = 1;if(dfs(bx,by,pos + 1,word,m,n,board,vis)) return true;vis[bx][by] = 0;}return false; }bool exist(vector<vector<char>>& board, string word) {int m = board.size(),n = board[0].size();vector<vector<int>> vis(m,vector<int> (n,0));unordered_map<char,int> bd_cnt;for (auto &row : board) {for (auto &p : row) {bd_cnt[p]++;}}unordered_map<char,int> word_cnt;if (word_cnt[word.back()] < word_cnt[word[0]]) {ranges::reverse(word);}for (auto &w : word) {if(++word_cnt[w] > bd_cnt[w]) return false;}for (int i = 0;i < m;i++) {for (int j = 0;j < n;j++) {if (board[i][j] == word[0]) {vis[i][j] = 1;if (dfs(i,j,1,word,m,n,board,vis)) {return true;}else{vis[i][j] = 0;}}}}return false;}
      };

                时间复杂度:O(mn3^4),m和n为行列数,对于每个入口最多有三个分支(因为上一个点已经搜索了一个方向),所以为O(mn3^4)

                空间复杂度:O(1)

 

http://www.xdnf.cn/news/10326.html

相关文章:

  • LeetCode 1010. 总持续时间可被 60 整除的歌曲
  • leetcode hot100刷题日记——30.两数之和
  • 那些常用的运维工具
  • LeetCode 1524. 和为奇数的子数组数目
  • 【题解-洛谷】P9422 [蓝桥杯 2023 国 B] 合并数列
  • Flask-Login使用示例
  • R语言错误处理方法大全
  • Python 从入门到精通视频下载
  • Nacos实战——动态 IP 黑名单过滤
  • 【LLM】FastAPI入门教程
  • 无公网ip远程桌面连接不了怎么办?内网计算机让外网访问方法和问题分析
  • 2. 手写数字预测 gui版
  • VMvare 创建虚拟机 安装CentOS7,配置静态IP地址
  • Kubernetes架构与核心概念深度解析:Pod、Service与RBAC的奥秘
  • 算法训练第四天
  • 企业上线ESOP(电子标准操作程序)电子作业指导书,实现车间无纸化,是数字化转型的重要一步
  • ZC-OFDM雷达通信一体化减小PAPR——部分传输序列法(PTS)
  • 利用python工具you-get下载网页的视频文件
  • 学习笔记:3个学习AI路上反复看到的概念:RAG,Langchain,Agent
  • MySql(十)
  • 字符串~~~
  • 【Python训练营打卡】day40 @浙大疏锦行
  • 前端学习(7)—— HTML + CSS实现博客系统页面
  • python魔法函数
  • 《操作系统真相还原》——初探保护模式
  • 使用curlconverter网站快速生成requests请求包
  • 【Docker 新手入门指南】第十五章:常见故障排除
  • pytest 常见问题解答 (FAQ)
  • 头歌java课程实验(学习-Java字符串之正则表达式之元字符之判断字符串是否符合规则)
  • 每日c/c++题 备战蓝桥杯(P1204 [USACO1.2] 挤牛奶 Milking Cows)