20240313-2-search

search

bfs 和 dfs的相关的题目
在这里插入图片描述

1. 全排列

题目: 给定一个数字列表,返回其所有可能的排列。

// premute(ans, nums, 0)
void permute(vector<vector<int> > &ans, vector<int> &nums, int k){if(k==nums.size()-1){ans.push_back(nums);}// 以k开头的所有排列for(int i=k;i<nums.size();i++){// 以每一个都作为开头,进行遍历swap(nums[i],nums[k]);permute(ans,nums,k+1);// 回溯swap(nums[i],nums[k]);}
}

2. 子集

题目: 给定一个可能具有重复数字的列表,返回其所有可能的子集。

// 调用函数dfs(res, sub, , nums, 0)之前, nums 必须首先排序, 
// sort(nums.begin(), nums.end());
void dfs(vector<vector<int>> &res, vector<int> &sub, vector<int> &nums, int k) {   res.push_back(sub);for(int i= k; i < nums.size(); i++) {// 跳过相同元素, if(i != k && nums[i] == nums[i - 1]) continue; sub.push_back(nums[i]);dfs(res, sub, nums, i + 1);// 回溯其他可能组合sub.pop_back();}
}

3. Word Break Problem

题目: 给一字串s和单词的字典dict,在字串中增加空格来构建一个句子,并且所有单词都来自字典。返回所有有可能的句子。
分析: 利用f[i]记录以i为起点的每个片段的终点j,并且片段要在字典中,然后从0位置开始搜索,每次给当前片段加上空格,然后以当前片段的末尾作为下一次搜索的头部,避免不必要的搜索。


vetor<int> f[1000];
vector<string> wordBreak(string &s, unordered_set<string> &wordDict) {n = s.length();int i, j;// 遍历所有可能的(i,j)组合,是否在字典中for (i = n - 1; i >= 0; --i) {for (j = i + 1; j <= n; ++j) {if (wordDict.find(s.substr(i, j - i)) != wordDict.end()) {// 大家请思考不加这个条件和加条件有什么区别,// if (j == n || f[j].size() > 0) //    f[i].push_back(j);f[i].push_back(j);}}}dfs(0, s, "");return res;
}
void dfs(int p, string s, string &now, vector<int> &res) {if(p == s.size()) {res.push_back(now);return;}if(p > 0) { // 找到一个单词划分now += " ";}   // 遍历所有以p开头, 以j结尾的划分进行dfsfor(int i = 0; i < f[p].size(); i ++) {dfs(f[p][i], s, now+s.substr(p, f[p][i]-p), res);}
}

4. K-Similar Strings

题目: 如果可以通过将 A 中的两个小写字母精确地交换位置 K 次得到与 B 相等的字符串,我们称字符串 A 和 B 的相似度为 K(K 为非负整数)。
给定两个字母异位词 A 和 B ,返回 A 和 B 的相似度 K 的最小值。
解析: 这是一个bfs的问题, 每次改变A的一个字符, 和B进行比较,
将改变后的A加入到候选队列中,直到所有出现A==B位置,得到此时的次数.

struct Node {string s;int step;Node(string _s, int _step):s(_s),step(_step);Node(){}
};int kSimilarity(string &A, string &B) {Node start(A, 0);queue<Node> q;set<string> vis;q.push(start);int ans = 0;while(q.size()) {Node str = q.front();q.pop();if(str.s == B) {ans = str.step;break;}int i = 0;while(str[i] == B[i]) i ++;for(int j = i + 1; j < B.size(); j ++) {if(str[j] != B[j] && str[j] == B[i]) {string temp = str;swap(temp[i], temp[j]);if(vis.find(temp) == vis.end()) {q.push(Node(temp, str.step+1));vis.insert(temp);}}}}return ans;
}

5. 无向图的联通块

题目: 给一个布尔类型的二维数组, 0 表示海, 1 表示岛。如果两个1是相邻的,那么我们认为他们是同一个岛.我们只考虑 上下左右 相邻. 求出岛屿的个数.
解析: 这就是无向图的联通块问题, 我们遍历所有是1的位置进行dfs(i,j), 并且将所有访问过的位置记录下来,如果当前位置是1,而且没有访问,则次数就加1.

void dfs(vector<vector<int>> &grid, int i, int j) {if(i < 0 || i >= grid.size()) return;if(j < 0 || j >= grid[0].size()) return;if(!grid[i][j]) return;grid[i][j] = 0;// 四个方向搜索dfs(grid, i-1, j);dfs(grid, i+1, j);dfs(grid, i, j-1);dfs(grid, i, j+1);
}
int numIslands(vector<vector<int>> &grid) {if (grid.empty() || grid[0].empty()) return 0;int N = grid.size(), M = grid[0].size();int cnt = 0;for (int i = 0; i < N; ++i) {for (int j = 0; j < M; ++j) {if (grid[i][j]) {dfs(grid, i, j);++cnt;}}}return cnt;
}

6. k个数的和

题目: 给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字。
在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案。
解析: dfs(i, k, target)
每次怕判断是够使用第i个值, 如果使用, dfs(i+1,k-1,target-arr[i])
如果不使用, dfs(i+1,k,target),
if target == 0, 则表示满足要求,存储结果

void dfs(vector<int> A, int i, int k, int target, vector<int> &now, vector<vector<int>> &res) {if(i > A.size() || target < 0 || k < 0) return;if(target == 0 && k==0) {res.push_back(now);return;}// usernow.push_back(A[i]);dfs(A, i+1, k-1, target-A[i], now, res);now.pop_back();// not use idfs(A, i+1, k, target, now, res);}
vector<vector<int>> kSumII(vector<int> &A, int k, int target) {// write your code herevector<vector<int>> res;vector<int> now;dfs(A,0,k,target,now,res);return res;}

7. 单词接龙

题目: 给出两个单词(start和end)和一个字典,找出从start到end的最短转换序列,输出最短序列的长度。
变换规则如下:

  • 每次只能改变一个字母。
  • 变换过程中的中间单词必须在字典中出现。(起始单词和结束单词不需要出现在字典中)

解析: 使用bfs进行变换,每一修改一个字符[‘a’–‘z’],判断是否在字典中,并记录当前的步数.

int ladderLength(string &start, string &end, unordered_set<string> &dict) {int length = 2;    if(start == end) return 1;queue<string> q;q.push(start);while(!q.empty()){int size = q.size();// 对每一个层以此处理, 这一个的都步数一样for(int i=0;i<size;i++){string tmp = q.front();q.pop();// 遍历tmp的所有的字符,进行26个字符的变换for(int j=0;j<tmp.size();j++){// 要记录老字符,因为最后要恢复char oldc = tmp[j];for(char c='a';c<='z';c++){if(tmp[j] == c) continue;tmp[j] = c;//验证是否已经满足条件if(tmp == end) return length;// 变换的单词是否在字典中if(dict.find(tmp) != dict.end()){q.push(tmp);dict.erase(tmp); // 防止多次使用}}// 恢复当前的变化,这个不变,变化下一个,tmp[j] = oldc;}}length ++;}return length;
}

8. 单词搜索

题目:
给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。

样例
样例 1:输入:["ABCE","SFCS","ADEE"],"ABCCED"
输出:true
解释:
[    A B C ES F C S A D E E
]
(0,0)A->(0,1)B->(0,2)C->(1,2)C->(2,2)E->(2,1)D
样例 2:输入:["z"],"z"
输出:true
解释:
[ z ]
(0,0)z
bool dfs(int i, int j, int k, vector<vector<char>> &board, string word, vector<vector<int>> &vis) {if(board[i][j] == word[k]) {++ k;if(k == word.size()) {return true;}}else return false;bool flag = false; vis[i][j] = 1;if(i-1 >=0 && (!vis[i-1][j]) && board[i-1][j] == word[k]) flag = flag | dfs(i-1, j, k, board, word, vis); if(flag) return flag;if(i+1 < board.size() && (!vis[i+1][j]) && board[i+1][j] == word[k]) flag = flag | dfs(i+1, j, k, board, word, vis); if(flag) return flag;if(j-1 >= 0 && (!vis[i][j-1]) && board[i][j-1] == word[k]) flag = flag | dfs(i, j-1, k, board, word, vis);if(flag) return flag;if(j+1 <= board[0].size() && (!vis[i][j+1]) && board[i][j+1] == word[k]) flag = flag | dfs(i, j+1, k, board, word, vis);// 下次使用标记vis[i][j] = 0;return flag;
}    
bool exist(vector<vector<char>> &board, string &word) {if(board.empty() || board[0].size() == 0) return false;bool res = false;vector<vector<int>> vis(board.size(), vector<int>(board[0].size(), 0));for(int i = 0; i < board.size(); i ++) {for(int j = 0; j < board[i].size(); j ++) {if(word[0] == board[i][j] && dfs(i,j,0,board,word, vis)){return true;                    }}}return res;   
}

9. 分割字符串

题目: 给一个字符串,你可以选择在一个字符或两个相邻字符之后拆分字符串,使字符串由仅一个字符或两个字符组成,输出所有可能的结果.
解析: dfs(s) = dfs(s-1) + dfs(s-2)

void dfs(int i, string s, vector<string> &now, vector<vector<string>> &res) {if(i == s.size()) {res.push_back(now);return;}if(s.size() - i == 1) {now.push_back(s.substr(i, 1));dfs(i+1,s,now,res);now.pop_back();return;}if(s.size() - i >= 2) {now.push_back(s.substr(i, 1));dfs(i+1,s,now,res);    now.pop_back();now.push_back(s.substr(i, 2));dfs(i+2,s,now,res);now.pop_back();}    
} 
vector<vector<string>> splitString(string& s) {vector<string> now; vector<vector<string>> res;dfs(0,s,now,res);    return res;
}

10. 划分回文串

题目: 给定一个字符串S,将S切分成每一个子串都是回文串,返回所有可能的结果.

Input  : s = "bcc"
Output : [["b", "c", "c"], ["b", "cc"]]
bool checkPalindrome(string str) { int len = str.length(); len--; for (int i=0; i<len; i++) { if (str[i] != str[len]) return false; len--; } return true; 
} 
void addStrings(vector<vector<string> > &v, string &s, vector<string> &temp, int index) { int len = s.length(); string str; vector<string> current = temp; if (index == 0) temp.clear(); for (int i = index; i < len; ++i) { str = str + s[i]; if (checkPalindrome(str)) { temp.push_back(str); if (i+1 < len) addStrings(v,s,temp,i+1); elsev.push_back(temp); temp = current; } } return; 
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2870106.html

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

相关文章

算法打卡day19|二叉树篇08|Leetcode 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

算法题 Leetcode 235. 二叉搜索树的最近公共祖先 题目链接:235. 二叉搜索树的最近公共祖先 大佬视频讲解&#xff1a;二叉搜索树的最近公共祖先视频讲解 个人思路 昨天做过一道二叉树的最近公共祖先&#xff0c;而这道是二叉搜索树&#xff0c;那就要好好利用这个有序的特点…

zed2i相机驱动的安装(2)

安装完sdk和wrapper&#xff0c;启动时显示缺少标定文件&#xff0c;第一反应是运行自带的标定程序 但是此时运行ZED tools里的标定程序也会出问题 打开 On Linux : /usr/local/zed/settings/On Windows : C:\ProgramData\Stereolabs\settings 查看里面是否是空的&#xff…

Android系统签名的制作与使用

目录 1. &#x1f4c2; 背景 2. &#x1f531; 制作Android系统签名 步骤一&#xff1a;找到platform.pk8和platform.x509.pem签名文件 步骤二&#xff1a;下载keytool-importkeypair签名工具 步骤三&#xff1a;使用签名文件和签名工具生成.jks签名文件 3. ✅ 使用Andro…

嵌入空间(Embedding Space)

摘要&#xff1a; 嵌入空间&#xff08;Embedding Space&#xff09;是一种在数学、机器学习和自然语言处理等领域广泛应用的概念。它指的是将原本复杂、离散或者高维的数据结构转换为一个连续的、低维向量空间的过程&#xff0c;使得这些数据能够在新的空间中以向量的形式表示…

AI_寻路系统_修改寻路网格体__下

虚幻引擎的 寻路系统&#xff08;Navigation System&#xff09; 向人工智能代理提供了寻路功能。为了能够找到开始位置和目的地之间的路径&#xff0c;从世界的碰撞几何结构生成了寻路网格体。 默认设置将寻路网格体细分为图块&#xff0c;以允许重建寻路网格体的本地化部件。…

FFplay播放参数详解决及示例

1. -version 查看版本 2. -buildconf 查看编译配置 3. -formats 显示所有支持的媒体格式 4. -muxers 查看所有的封装 5. -demuxers 查看所有支持的解封装

webots的安装和体验

刚知道webots是一个机器人仿真软件&#xff0c;好像离开硬件可以自己玩玩&#xff0c;而且有人形机器人的源代码&#xff0c;试试看吧。 Cyberbotics: Robotics simulation with Webotshttps://www.cyberbotics.com/ 官网下载&#xff0c;有windows版本&#xff0c;看上去好简…

学习JavaEE的日子 Day27 手撕HashMap底层原理

Day27 1.手撕HashMap底层原理(重点) public class Test01 {public static void main(String[] args) {// Float float1 new Float("0.0f"); // Float float2 new Float("0.0f"); // Float result float1/float2; // System.out.println(result);/…

Airbnb将禁止在房源内安装监控摄像头

在面临隐私问题后&#xff0c;Airbnb 最近更新了政策&#xff0c;全面禁止房东在出租屋内安装并使用室内安全监控摄像头。 修订后的政策将在全球范围内适用&#xff0c;并将于4 月 30 日生效。Airbnb 表示&#xff0c;做出这一改变是为了优先考虑客人的隐私并简化安全摄像头的规…

Android 13 源码编译及报错修复

下载AOSP指定分支 repo init -u git://aosp../platform/manifest -b android-13.0.0_r83 同步代码到本地 repo sync -c 初始化编译环境, 选择构建目标 source build/envsetup.sh lunch 选择需要构建的目标&#xff0c;此处以aosp_arm64-eng为例 进行固件编译 make -j12 期间编译…

基于Matlab的车牌识别算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

代码随想录算法训练营第25天|16.组合总和III|17.电话号码的字母组合

代码随想录算法训练营第25天|16.组合总和III|17.电话号码的字母组合 216.组合总和III 如果把 组合问题理解了&#xff0c;本题就容易一些了。 题目链接/文章讲解&#xff1a;https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 视频讲解&#xf…

代码随想录算法训练营第41天 | 01背包问题(二维+一维) ,416. 分割等和子集

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 01背包理论基础 链接&#xff1a;https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%…

【Linux C | 多线程编程】线程的基础知识

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【Linux系列】计算机系统中的架构与发行版:理解与区分

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

软件测试 自动化测试selenium 基础篇

文章目录 1. 什么是自动化测试&#xff1f;1.1 自动化分类 2. 什么是 Selenium &#xff1f;3. 为什么使用 Selenium &#xff1f;4. Selenium 工作原理5. Selenium 环境搭建 1. 什么是自动化测试&#xff1f; 将人工要做的测试工作进行转换&#xff0c;让代码去执行测试工作 …

使用PWM实现呼吸灯功能

CC表示的意思位捕获比较&#xff0c;CCR表示的是捕获比较寄存器 占空比等效于PWM模拟出来的电压的多少&#xff0c;占空比越大等效出的模拟电压越趋近于高电平&#xff0c;占空比越小等效出来的模拟电压越趋近于低电平&#xff0c;分辨率表示的是占空比变化的精细程度&#xf…

ChatGPT GPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术

原文链接&#xff1a;ChatGPT GPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596849&idx3&sn111d68286f9752008bca95a5ec575bb3&chksmfa823ad6cdf5b3c0c446eceb5cf29cccc3161d746bdd9f2…

【C++】类和对象终章

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、初始化列表1.1 初始化列表的形式1.2 初始化列表的注意事项 二、explicit关键…

Halcon识别文字案例

识别文字并显示到页面上 read_image (Image, needle1.png) * 打开窗口 dev_open_window (0, 0, 512, 512, black, WindowHandle) dev_display (Image)* 画矩形 gen_rectangle1 (ROI_0, 52.4648, 99.0391, 256.758, 354.063) * 裁剪 reduce_domain (Image, ROI_0, ImageReduced)…