剑指Offer题目笔记25(使用回溯法解决其他类型问题)

面试题85:

面试题85

问题:

​ 输入一个正整数n,输出所有包含n个左括号和n个右括号的组合,要求每个组合的左括号和右括号匹配。

解决方案:

​ 使用回溯法。因为要生成n个左括号和n个右括号,故需要走2n步,每一步生成一个括号,每一步都面临两个选项,既可能生成左括号也可能生成右括号。有限制条件,第一:左括号和右括号的个数不能大于n;第二:已生成右括号的个数不能大于已生成左括号。

源代码:
class Solution {public List<String> generateParenthesis(int n) {List<String> result = new LinkedList<>();dfs(n,n,"",result);return result;}//left表示未生成左括号个数、right表示未生成右括号个数private void dfs(int left,int right,String s,List<String> result){if(left == 0 && right == 0){result.add(s);return;}if(left > 0){dfs(left-1,right,s + "(",result);}//当生成左括号的个数大于生成右括号的个数时,出现生成右括号的情况。if(left < right){dfs(left,right-1,s+")",result);}}
}

面试题86:

面试题86

问题:

​ 输入一个字符串,要求将它分割成若干子字符串,使每个子字符串都是回文。

解决方案:

​ 使用回溯法。当处理到字符串中的某个字符时,如果包括该字符在内后面还有n个字符,那么此时面临n个选项,即分割出长度为1的子字符串(只包含该字符)、分割出长度为2子字符串(即包含该字符及它后面的一个字符),以此类推,分割出长度为n的子字符串(即包含该字符在内的后面的所有字符)。由于题目要求分割出来的每个子字符串都是回文,因此需要逐一判断这n个子字符串是不是回文,只有回文子字符串才是符合条件的分割。分割出一段回文子字符串之后,接着分割后面的字符串。

源代码:
class Solution {public List<List<String>> partition(String s) {List<List<String>> result = new LinkedList<>();dfs(s,0,new LinkedList<>(),result);return result;}private void dfs(String s,int start,LinkedList<String> list,List<List<String>> result){if(start == s.length()){result.add(new LinkedList<>(list));}else{//分割出包括该字符在内后面还有n个字符,长度为1的子字符串(只包含该字符)、分割出长度为2子字符串(即包含该字符及它后面的一个字符)。for(int i = start;i < s.length();i++){if(isBack(s,start,i)){list.add(s.substring(start,i+1));//继续对分割剩余部分进行判断dfs(s,i+1,list,result);list.removeLast();}}       }}//判断从字符串str下标start到end的子字符串是否是回文字符串。private boolean isBack(String str,int start,int end){while(start < end){if(str.charAt(start++) != str.charAt(end--)){return false;}}return true;}
}

面试题87:

面试题87

问题:

​ 输入一个只包含数字的字符串,列出所有可能恢复出来的IP地址。

解决方案:

​ 使用回溯法。逐个扫描输入字符串中的字符以恢复IP地址。针对字符串中的每个数字,通常面临两个选项。第1个选项是将当前字符拼接到当前分段数字的末尾,拼接之后的数字应该在0到255之间。第2个选项是当前字符作为一个新的分段数字的开始。需要注意的是,一个IP地址最多只有4个分段数字,并且当开始一个新的分段数字时前一个分段数字不能是空的。

源代码:
class Solution {public List<String> restoreIpAddresses(String s) {List<String> result = new LinkedList<>();dfs(s,0,0,"","",result);return result;}//i用于记录已经扫描到字符串的下标、segI表示当前分段数字的下标、seg表示当前分段字符串、ip表示已经拼接好的部分IP地址private void  dfs(String s,int i,int segI,String seg,String ip,List<String> result){if(i == s.length() && segI == 3 && isValidSeg(seg)){result.add(ip + seg);//例如字符串s为10203040}else if(i < s.length() && segI <= 3){//当ch为2时,seg为10char ch = s.charAt(i);if(isValidSeg(seg + ch)){//情况一:添加当前char字符到该分段,seg字符串变为102dfs(s,i+1,segI,seg + ch,ip,result);}if(seg.length() > 0 && segI < 3){//情况二:不添加当前char字符到该分段,seg字符串变为2,IP地址为10.dfs(s,i + 1,segI + 1,"" + ch,ip + seg + ".",result);}}}//判断当前分段数字是否有效private boolean isValidSeg(String seg){return Integer.valueOf(seg) <= 255 && (seg.equals("0") || seg.charAt(0) != '0');}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2012年认证杯SPSSPRO杯数学建模D题(第二阶段)人机游戏中的数学模型全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 D题 人机游戏中的数学模型 原题再现&#xff1a; 计算机游戏在社会和生活中享有特殊地位。游戏设计者主要考虑易学性、趣味性和界面友好性。趣味性是本质吸引力&#xff0c;使玩游戏者百玩不厌。网络游戏一般考虑如何搭建安全可靠、丰富多彩的…

红黑树路径长度分析:证明与实现

红黑树路径长度分析&#xff1a;证明与实现 一、红黑树的基本性质二、证明&#xff1a;最长路径至多是最短路径的2倍2.1 证明思路2.2 证明过程 三、伪代码实现四、 C语言代码实现5、 结论 红黑树作为一种高效的自平衡二叉搜索树&#xff0c;在计算机科学领域中被广泛应用于各种…

活动回顾丨掘金海外,探寻泛娱乐社交APP出海新风口

3月中旬,Flat Ads携手声网、XMP在广州成功举办“泛娱乐社交APP出海新风口——广州站”的主题线下沙龙活动。 多位大咖与泛娱乐社交APP赛道的行业伙伴汇聚一堂。本次活动邀请到Flat Ads 市场VP 王若策、声网娱乐视频产品负责人 陈际陶、XMP资深产品运营专家 屈俊星等多位行业大…

深度学习理论基础(三)封装数据集及手写数字识别

目录 前期准备一、制作数据集1. excel表格数据2. 代码 二、手写数字识别1. 下载数据集2. 搭建模型3. 训练网络4. 测试网络5. 保存训练模型6. 导入已经训练好的模型文件7. 完整代码 前期准备 必须使用 3 个 PyTorch 内置的实用工具&#xff08;utils&#xff09;&#xff1a; ⚫…

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…

【QT入门】 Qt代码创建布局综合运用:仿写腾讯会议登陆界面

往期回顾&#xff1a; 【QT入门】 Qt代码创建布局之水平布局、竖直布局详解-CSDN博客 【QT入门】 Qt代码创建布局之栅格布局详解-CSDN博客 【QT入门】 Qt代码创建布局之分裂器布局详解-CSDN博客 【QT入门】 Qt代码创建布局综合运用&#xff1a;仿写腾讯会议登陆界面 一、界面分…

算法 - 符号表-下

&#x1f600;前言 推荐从上看到下 算法 - 符号表-上 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 算法 - 符号表查找树1. 插入操作2. 性质 红黑树1. 左旋转2. 右旋转3. 颜色转换4. 插入5. 分析 散列表1. 散列函数2. 拉链法3. 线性探测法3.1 查找3.2 插入3.3 删除3.5 …

InternLM2-lesson2笔记

书生浦语大模型趣味 Demo 视频连接&#xff1a;https://www.bilibili.com/video/BV1AH4y1H78d/?vd_source902e3124d4683c41b103f1d1322401fa 目录 书生浦语大模型趣味 Demo课程总览SIG项目Demo部署的一般流程存在的问题总结 课程总览 InternLM2-chat-1.8B部署八戒-chat-1.8B…

Solidity入门1: 3. 函数类型

Solidity中的函数 solidity官方文档里把函数归到数值类型 函数结构 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)] 看着些复杂&#xff0c;咱们从前往后一个一个看&…

进程的控制

进程的创建 frok函数添加进程 进程内核的相关管理数据结构&#xff08;task_struct mm_struct页表&#xff09;代码数据 特性&#xff1a; 分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回&#xff0c;开始调…

grep无法使用完整的正则表达式

问题描述 grep无法使用完整的正则表达式&#xff0c;比如前置断言、后置断言、\d和\t、\n等 问题原因 使用了扩展正则&#xff0c;而不是perl正则。规则和perl正则不同 从文档上讲得很清楚&#xff1a; -E PATTERN is an extended regular expression 他是扩展表达式&#…

文字超出收起展开功能的实现(vue2)

1.编写展开收起组件 <template><div class"text-clamp"><div class"text" :style"{height}"><span v-if"isVisible" class"btn" click"toggle">{{isExpand ? 收起 : ... 展开}}</spa…