news 2026/6/12 17:55:47

回溯算法--复原IP地址

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
回溯算法--复原IP地址
  • 输入:s = "25525511135"
  • 输出:["255.255.11.135","255.255.111.35"]

建议先看分割回文串,再学习此算法

注意点:

  1. 题目要求result是vector<string>类型,和之前不同,需要注意,path如果也还是vector<string>类型,最终结果怎么组合。
  2. 怎么判断一个字符串是否合法,怎么将一个字符串转化为整数(循环转化)。如果不使用该方法,直接使用stoi(s)转化也可以。
  3. 不要忘记递归深度。

1.

path数组里面存储的是分割后的字符串,最后拼接在一起。这里的path.size() == 4 就限制了递归深度只能为4,即只能分割为四个字符串。

if (path.size() == 4 && startIndex == s.size()) { // 拼接成一个完整的IP地址字符串 string ipAddress = path[0] + "." + path[1] + "." + path[2] + "." + path[3]; result.push_back(ipAddress); return; }

2.

循环验证每个字符时候合法(1-9),并且将数字字符串转化为整数。

for(int i = 0; i < s.size(); i ++){ // 3.1 检查是否是数字字符 if(s[i] > '9' || s[i] < '0') return false; // 3.2 将字符转换为数字并累加 // 例如:"123"的处理过程: // i=0: num = 0*10 + 1 = 1 // i=1: num = 1*10 + 2 = 12 // i=2: num = 12*10 + 3 = 123 num = num * 10 + (s[i] - '0'); // 3.3 实时检查是否超过255,避免溢出问题 if(num > 255) return false; }

解决以上注意点,基本没什么难度了。

代码

#include<iostream> #include<vector> #include<string> // 引入string库以使用stoi using namespace std; class Solution { private: // result: 用于存储所有有效的、格式化后的IP地址 vector<string> result; // path: 用于存储当前正在构造的IP地址的四个分段 vector<string> path; // 核心的回溯函数 // s: 输入的原始数字字符串 // startIndex: 当前准备为哪个分段截取数字的起始索引 void backtracking(const string& s, int startIndex) { // 终止条件1:如果已经找到4个分段,并且所有字符都用完了 if (path.size() == 4 && startIndex == s.size()) { // 拼接成一个完整的IP地址字符串 string ipAddress = path[0] + "." + path[1] + "." + path[2] + "." + path[3]; result.push_back(ipAddress); return; } // 终止条件2(剪枝):如果分段数已达4个但字符串未用完,或字符串用完但分段不足4个 if (path.size() == 4 || startIndex == s.size()) { return; } // 单层搜索:尝试截取1到3位数字作为当前分段 for (int i = startIndex; i < s.size(); i++) { // 截取 [startIndex, i] 之间的子串作为IP地址的一个分段 string segment = s.substr(startIndex, i - startIndex + 1); // 检查该分段是否有效 if (isValid(segment)) { path.push_back(segment); // 选择:将有效分段加入路径 backtracking(s, i + 1); // 递归:处理下一个分段 path.pop_back(); // 回溯:撤销选择 } else { // 剪枝:如果当前分段已无效(如"01", "256"), // 那么任何包含它的更长分段("010", "2561")也必然无效, // 所以直接中断当前循环。 break; } } } // 判断一个字符串是否是合法的IP地址段(0-255) bool isValid(const string& s){ // 1. 长度检查:IP段长度不能超过3位 if (s.size() > 3) return false; // 2. 前导零检查:如果长度大于1且第一个字符是'0',则为非法(如"01"、"001") if (s.size() > 1 && s[0] == '0') return false; int num = 0; // 用于累加计算的数值 // 3. 逐字符检查并转换为数字 for(int i = 0; i < s.size(); i ++){ // 3.1 检查是否是数字字符 if(s[i] > '9' || s[i] < '0') return false; // 3.2 将字符转换为数字并累加 // 例如:"123"的处理过程: // i=0: num = 0*10 + 1 = 1 // i=1: num = 1*10 + 2 = 12 // i=2: num = 12*10 + 3 = 123 num = num * 10 + (s[i] - '0'); // 3.3 实时检查是否超过255,避免溢出问题 if(num > 255) return false; } // 原始代码中被注释掉的 stoi(s) > 255 是另一种实现方式 // 但当前实现更安全,避免了字符串转整数的异常 return true; // 所有检查通过,是合法的IP段 } public: // 主函数,用于恢复IP地址 vector<string> restoreIpAddresses(string s) { result.clear(); path.clear(); // 剪枝:如果字符串长度不足4或超过12,不可能组成有效IP if (s.size() < 4 || s.size() > 12) { return result; } backtracking(s, 0); return result; } }; int main() { Solution S; string s = "0000"; vector<string> result = S.restoreIpAddresses(s); // 遍历并打印所有有效的IP地址 for (const auto& ip : result) { cout << ip << endl; } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:24:50

《Vue.js架构深度解析:构建下一代企业级应用的工程实践与性能艺术》

摘要本文荣获CSDN技术文章质量评估96.8分&#xff0c;从Vue.js核心原理到企业级架构实践&#xff0c;提供全方位的深度技术解析。我们不仅讨论如何使用Vue&#xff0c;更重要的是探讨为什么这样设计以及如何达到极致性能。通过源码级解析、性能数学建模、架构设计模式等维度&am…

作者头像 李华
网站建设 2026/6/11 15:50:02

如何用AI快速生成UReport2报表模板?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请基于UReport2框架生成一个员工考勤统计报表模板。要求包含&#xff1a;1) 员工姓名、部门、工号等基本信息&#xff1b;2) 月度考勤数据统计&#xff1b;3) 迟到早退次数统计&…

作者头像 李华
网站建设 2026/6/10 14:18:58

从30分钟到30秒:AI如何加速构建错误排查

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个效率对比工具&#xff0c;展示AI辅助与传统方式解决execution failed构建错误的时间差异。功能包括&#xff1a;1) 模拟传统排查流程&#xff1b;2) 展示AI自动分析过程&am…

作者头像 李华
网站建设 2026/6/11 23:15:01

技术破局与普惠之道:心理咨询行业的数字化跃迁与央心心理的实践

当前&#xff0c;中国社会对心理健康服务的需求正以前所未有的速度增长。然而&#xff0c;一个尖锐的矛盾横亘在需求与供给之间&#xff1a;一面是日益攀升的心理健康风险&#xff0c;另一面是高昂的费用、稀缺且分布不均的专业资源以及尚在发展初期的行业规范。在这一背景下&a…

作者头像 李华
网站建设 2026/6/11 16:06:40

电商平台用户密码加密实战:AES vs SHA-256

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个电商用户系统的密码加密方案演示&#xff0c;要求&#xff1a;1. 实现AES-256加密存储方案 2. 实现SHA-256加盐哈希方案 3. 对比两种方案的性能和安全特性 4. 提供测试用例…

作者头像 李华
网站建设 2026/6/10 10:34:18

省时90%!Docker容器化安装MySQL的Mac最佳实践

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Docker Compose配置文件&#xff0c;实现在Mac上快速部署MySQL服务。要求&#xff1a;1.支持MySQL 8.0 2.数据持久化配置 3.自定义端口映射 4.初始化数据库和用户 5.性能调…

作者头像 李华