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

news2025/6/2 11:25:27

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

                

        例如,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.coloradmin.cn/o/2394143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ICDMC 2025:创新媒体模式,迎接数字时代的挑战

2025年数字媒体与通讯国际会议将在风景秀丽的中国山东举行。此次会议致力于促进数字媒体和通讯领域的国际合作与交流&#xff0c;为相关产业发展提供智力支持和技术引领。我们诚挚邀请来自世界各地的学者、研究人员和行业专家参加本次会议&#xff0c;共同探讨前沿问题和发展方…

SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!

摘要&#xff1a;人类的认知通常涉及通过抽象、灵活的概念进行思考&#xff0c;而不是严格依赖离散的语言符号。然而&#xff0c;当前的推理模型受到人类语言边界的限制&#xff0c;只能处理代表语义空间中固定点的离散符号嵌入。这种离散性限制了推理模型的表达能力和上限潜力…

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册 晨控CK-UR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围绕…

开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案

科研领域对机器人技术的需求日益增长&#xff0c;Hello Robot的移动操作机器人Stretch 3凭借其灵活性和性能满足了这一需求。其模块化设计、开源架构和高精度传感控制能力&#xff0c;使科研人员能够顺利开展实验。Stretch 3以其独特的移动操作能力&#xff0c;为科研探索提供了…

元胞自动机(Cellular Automata, CA)

一、什么是元胞自动机&#xff08;Cellular Automata, CA&#xff09; 元胞自动机&#xff08;CA&#xff09; 是一种基于离散时间、离散空间与规则驱动演化的动力系统&#xff0c;由 冯诺依曼&#xff08;John von Neumann&#xff09; 于1940年代首次提出&#xff0c;用于模…

智能手表单元测试报告(Unit Test Report)

📄 智能手表单元测试报告(Unit Test Report) 项目名称:Aurora Watch S1 模块版本:Firmware v1.0.4 测试阶段:模块开发完成后的单元测试 报告编号:AW-S1-UTR-2025-001 测试负责人:赵磊(软件架构师) 报告日期:2025-xx-xx 一、测试目的 通过对智能手表关键功能模块进…

微深节能 码头装卸船机定位与控制系统 格雷母线

微深节能码头装卸船机定位与控制系统&#xff1a;格雷母线技术赋能港口作业智能化升级 在现代化港口散货装卸作业中&#xff0c;装卸船机是连接船舶与陆域运输的核心枢纽设备。传统装卸船机依赖人工操作&#xff0c;存在定位偏差大、动态协同难、安全风险高等痛点。微深节能基于…

Python实现P-PSO优化算法优化循环神经网络LSTM分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的迅猛发展&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变体LSTM&#xff08;Long S…

Scratch节日 | 龙舟比赛 | 端午节

端午节快乐&#xff01; 这款专为孩子们打造的Scratch游戏——《龙舟比赛》&#xff0c;让你在掌控龙舟的竞速中&#xff0c;沉浸式体验中华传统节日的魅力&#xff01; &#x1f3ae; 游戏亮点 节日氛围浓厚&#xff1a;化身龙舟选手&#xff0c;在波涛汹涌的河流中展开刺激竞…

electron开发百度桌面应用demo及如何打包应用

1.开发入口文件main.js 1-1 加载百度URL const { app, BrowserWindow, nativeImage } require(electron) const path require(node:path)const createWindow () > {const win new BrowserWindow({width: 800,height: 600,})//加载百度URLwin.loadURL(https://www.baid…

关于用Cloudflare的Zero Trust实现绕过备案访问国内站点说明

cloudflare 是一个可免费的CDN&#xff0c;CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;加速国内网站&#xff0c;通常是已备案的。Zero Trust类似FRP&#xff0c;可以将请求转发到目标服务器。在使用Zero Trust绕过备案访问国内网站需要&…

方正字库助力华为,赋能鸿蒙电脑打造全场景字体解决方案

2025年5月19日&#xff0c;搭载华为鸿蒙操作系统的鸿蒙电脑&#xff0c;面向用户推出集AI智能、互联流畅、安全保障和精致体验于一体的全新办公系统。作为鸿蒙生态核心字体服务商&#xff0c;方正字库为此次提供了全面的系统字体支持&#xff0c;涵盖中文、西文及符号三大类字库…

STM32 串口通信①:USART 全面理解 + 代码详解

一 前言 本篇文章并不会系统的从零开始讲起&#xff0c;适合大家对USART有一定的学习&#xff0c;再看本篇文章会有一定的收获&#xff0c;祝大家在本文中&#xff0c;吸收到新的知识。 二 通信方式 1&#xff09;按数据传输的方式分&#xff08;这就是“串行 vs 并行”&…

【Java Web】速通CSS

参考笔记:JavaWeb 速通CSS_java css-CSDN博客 目录 一、CSS入门 1. 基本介绍 2. 作用 二、CSS的3种引入方式 1. 行内式 1.1 示例代码 1.2 存在问题 2. 写在head标签的style子标签中 2.1 示例代码 2.2 存在问题 3.以外部文件的形式引入(开发中推荐使用)⭐⭐⭐ 3.1 说明 3…

NHANES指标推荐:ALI

文章题目&#xff1a;A cross-sectional study examining the relationship between the advanced lung cancer inflammation index and prostate cancer 中文标题&#xff1a;一项检查晚期肺癌炎症指数与前列腺癌之间关系的横断面研究 发表杂志&#xff1a;Journal of Health…

UE5 Mat HLSL - Load

特性Load()Sample()输入类型整数索引&#xff08;int2/int3&#xff09;浮点 UV 采样器状态&#xff08;SamplerState&#xff09;数据获取精确读取指定位置的原始数据基于 UV 插值和过滤后的数据典型用途精确计算、非过滤访问&#xff08;如物理模拟&#xff09;纹理贴图渲染…

【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程

摘要&#xff1a; 在 Unity 游戏开发中&#xff0c;键盘控制角色的移动与转向是基础功能之一。本文详细讲解如何使用 C# 实现基于 WASD 移动、QE 转向 与 Shift 加速奔跑 的角色控制器&#xff0c;适用于第一人称、第三人称、自由漫游等场景。通过直观的 Transform 控制方法与可…

HTML5 列表、表格与媒体元素、页面结构分析

1. 列表 无序列表 有序列表 定义列表 列表对比 2. 表格 跨列 跨行 跨行和跨列 3. HTML5的媒体元素 视频元素 注意&#xff1a;autoplay现在很多浏览器不支持了&#xff01; 音频元素 4. 页面结构分析 5. 总结

换宽带ip地址会变吗?同一个宽带如何切换ip地址

在当今互联网时代&#xff0c;IP地址作为网络设备的"身份证"&#xff0c;其重要性不言而喻。许多用户在使用宽带时都会遇到这样的疑问&#xff1a;换宽带IP地址会变吗&#xff1f;同一个宽带如何切换IP地址&#xff1f;本文将深入探讨这一问题&#xff0c;帮助读者全…

第100+41步 ChatGPT学习:R语言实现误判病例分析

本期是《第33步 机器学习分类实战&#xff1a;误判病例分析》的R版本。 尝试使用Deepseek-R1来试试写代码&#xff0c;效果还不错。 下面上R语言代码&#xff0c;以Xgboost为例&#xff1a; # 加载必要的库 library(caret) library(pROC) library(ggplot2) library(xgboost)…