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

LeetCode 刷题【77. 组合、78. 子集、79. 单词搜索】

77. 组合

自己做

解:回溯法

class Solution {
public:void getCombine(int begin, int end, int k, vector<int> &combine, vector<vector<int>> &res){if(combine.size() == k){                //取到组合res.push_back(combine);return;}for(int i = begin; i <= end; i++){      //逐个选取当前点combine.push_back(i);               //选点getCombine(i  + 1, end + 1, k, combine, res);combine.pop_back();                //还原}}vector<vector<int>> combine(int n, int k) {int begin = 1;          //第一个数选取起点int end = n - k + 1;    //第一个数选取终点vector<vector<int>> res;vector<int> combine;getCombine(begin, end, k, combine, res);return res;}
};

78. 子集

自己做

解:回溯法

class Solution {
public:void getCombine(int begin, int end, vector<int>& nums, vector<int> &combine, vector<vector<int>> &res){if(begin > end)                         //越界return;for(int i = begin; i <= end; i++){      //逐个选取当前点combine.push_back(nums[i]);               //选点res.push_back(combine);             //加入结果getCombine(i  + 1, end, nums, combine, res);combine.pop_back();                 //还原}}vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> res;vector<int> combine;res.push_back(vector<int>());           //插入空集getCombine(0, (int)nums.size() - 1, nums, combine, res);return res;}
};

79. 单词搜索

自己做

解:回溯法

class Solution {
public:bool is_exist = false;void search(int i, int j, int k, string &word, vector<vector<char>>& board, vector<vector<bool>>& acquire){ if(k == word.size()){             //取到了is_exist = true;return;}//还没取到的情况下(!is_exis), 试着取左边(能取到左边=》 j > 0, 左边没有被取过=》 !acquire[i][j - 1], 左边符合下一个字符=》 board[i][j - 1] == word[k])if(!is_exist && j > 0 && !acquire[i][j - 1] && board[i][j - 1] == word[k]){acquire[i][j - 1] = true;           //标记取过(i, j - 1)search(i, j - 1, k + 1, word, board, acquire);acquire[i][j - 1] = false;          //还原}//还没取到的情况下(!is_exis), 试着取上边(能取到上边=》 i > 0, 上边没有被取过=》 !acquire[i - 1][j], 上边符合下一个字符=》 board[i - 1][j] == word[k])if(!is_exist && i > 0 && !acquire[i - 1][j] && board[i - 1][j] == word[k]){acquire[i - 1][j] = true;           //标记取过(i - 1, j)search(i - 1, j, k + 1, word, board, acquire);acquire[i - 1][j] = false;          //还原}//还没取到的情况下(!is_exis), 试着取右边(能取到右边=》 j < board[0].size() - 1, 右边没有被取过=》 !acquire[i][j + 1], 右边符合下一个字符=》 board[i][j + 1] == word[k])if(!is_exist && j < (int)board[0].size() - 1 && !acquire[i][j + 1] && board[i][j + 1] == word[k]){acquire[i][j + 1] = true;           //标记取过(i, j + 1)search(i, j + 1, k + 1, word, board, acquire);acquire[i][j + 1] = false;          //还原}//还没取到的情况下(!is_exis), 试着取下边(能取到下边=》 i < board.size() - 1, 下边没有被取过=》 !acquire[i + 1][j], 下边符合下一个字符=》 board[i + 1][j] == word[k])if(!is_exist && i < (int)board.size() - 1 && !acquire[i + 1][j] && board[i + 1][j] == word[k]){acquire[i + 1][j] = true;           //标记取过(i + 1, j)search(i + 1, j, k + 1, word, board, acquire);acquire[i + 1][j] = false;          //还原}}bool exist(vector<vector<char>>& board, string word) {int m = board.size();int n = board[0].size();vector<vector<bool>> acquire(m, vector<bool>(n, false));for(int i = 0; i < m; i++)                          //取第一个字符for(int j = 0; j < n; j++){if(board[i][j] == word[0]){acquire[i][j] = true;           //标记取过(i, j)search(i, j, 1, word, board, acquire);acquire[i][j] = false;          //还原if(is_exist)                    //找到了return is_exist;}}return is_exist;                            //找遍了都没有找到}
};

看题解

剪枝

https://leetcode.cn/problems/word-search/solutions/2927294/liang-ge-you-hua-rang-dai-ma-ji-bai-jie-g3mmm

代码如下

class Solution {static constexpr int DIRS[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public:bool exist(vector<vector<char>>& board, string word) {unordered_map<char, int> cnt;for (auto& row : board) {for (char c : row) {cnt[c]++;}}// 优化一unordered_map<char, int> word_cnt;for (char c : word) {if (++word_cnt[c] > cnt[c]) {return false;}}// 优化二if (cnt[word.back()] < cnt[word[0]]) {ranges::reverse(word);}int m = board.size(), n = board[0].size();auto dfs = [&](this auto&& dfs, int i, int j, int k) -> bool {if (board[i][j] != word[k]) { // 匹配失败return false;}if (k + 1 == word.length()) { // 匹配成功!return true;}board[i][j] = 0; // 标记访问过for (auto& [dx, dy] : DIRS) {int x = i + dx, y = j + dy; // 相邻格子if (0 <= x && x < m && 0 <= y && y < n && dfs(x, y, k + 1)) {return true; // 搜到了!}}board[i][j] = word[k]; // 恢复现场return false; // 没搜到};for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (dfs(i, j, 0)) {return true; // 搜到了!}}}return false; // 没搜到}
};


文章转载自:

http://O8br91df.rbffj.cn
http://mpXs2xHW.rbffj.cn
http://i1FxuSC7.rbffj.cn
http://mWqvCjaa.rbffj.cn
http://CXLhyfTU.rbffj.cn
http://Z8VY0Rn8.rbffj.cn
http://cEXj9L3G.rbffj.cn
http://pZcNKWkv.rbffj.cn
http://oJMNU0jN.rbffj.cn
http://gwA4shVG.rbffj.cn
http://Vs8tj4zy.rbffj.cn
http://HZmxnFsH.rbffj.cn
http://s6JZCVHm.rbffj.cn
http://8GopHtvQ.rbffj.cn
http://GxOD6Oqw.rbffj.cn
http://9Tt4IcN8.rbffj.cn
http://XBXlLCdt.rbffj.cn
http://Hge1X44o.rbffj.cn
http://jBE90HN6.rbffj.cn
http://nnD2Jibd.rbffj.cn
http://erh2OQ5A.rbffj.cn
http://KBZKcefB.rbffj.cn
http://EkvXjNmX.rbffj.cn
http://KjvIAubA.rbffj.cn
http://ukSy2L36.rbffj.cn
http://ha5ggoZU.rbffj.cn
http://Ih16vPj9.rbffj.cn
http://CxF73XfF.rbffj.cn
http://CiQXCguS.rbffj.cn
http://p49H4BAv.rbffj.cn
http://www.dtcms.com/a/385606.html

相关文章:

  • Jenkins 构建清理策略:自带功能 vs Discard Old Build 插件,全场景实操指南
  • DevOps历程-Gogs的安装与部署
  • FreeRTOS 任务静态创建与句柄详解
  • 嵌入式音视频开发——RTMP协议详解
  • 每日一题(6)
  • 信号量主要API及综合应用
  • 【开题答辩全过程】以 B站用户视频喜好倾向数据分析系统为例,包含答辩的问题和答案
  • ARM架构学习6.2——中断理解
  • 搭建Qt5.14.2+msvc2017_x64项目测试Opencv4.10功能
  • Steger 算法 的原理和流程
  • WD5030K:一款7-30V宽输入范围、12A高效同步降压DC-DC转换器芯片详解
  • 《2025年AI产业发展十大趋势报告》五十七
  • 滴滴试点返程费自主议价将会怎么改变市场?
  • 【嵌入式原理系列-第八篇】USART从原理到配置全解析
  • Python4-seaborn
  • 使用 Aamzon Step Functions 重构无服务器工作流
  • 模电基础:场效应管
  • Typescript工具类型
  • Spring异步编程- 浅谈 Reactor 核心操作符
  • 21.5 单卡24G训7B大模型!HuggingFace TRL+QLoRA实战,3倍提速显存直降70%
  • git中,如果在文件夹A下有文件夹B、C文件夹,现在在A下创建仓库,连接远程仓库,那么如何在提交的时候忽略B、C,排除对B、C管理
  • Java Web 入门实战:SpringBoot+Spring MVC 从 0 到 1 学习指南
  • 电磁流量计可靠品牌之选,基恩士提供多样化解决方案
  • 三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
  • Baklib:从传统到AI驱动的新一代数字体验平台
  • 机器视觉在人形机器人中有哪些检测应用
  • Java的Arrays类
  • 每天认识一个电子器件之LED灯
  • 每日前端宝藏库 | anime.js⏳✨
  • CSS脉冲光环动画效果