news 2026/6/23 13:03:26

回溯算法--复原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/22 22:19:22

零基础小白也能懂的JDK 17安装图解教程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 生成一个交互式JDK 17安装向导程序&#xff0c;要求&#xff1a;1.图形化界面 2.分步骤引导用户完成下载和安装 3.实时显示操作截图和说明 4.内置常见问题解答 5.安装完成后弹出验证…

作者头像 李华
网站建设 2026/6/22 9:22:34

零基础教程:5分钟用快马制作你的第一个卸载工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个极简Office卸载工具&#xff0c;要求&#xff1a;1. 一键式操作界面 2. 自动识别常见版本 3. 基础清理功能 4. 进度条显示 5. 新手友好提示。使用Batch脚本简单GUI封装。点…

作者头像 李华
网站建设 2026/6/7 2:42:28

5分钟快速原型:用AI生成测试数据库结构

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个快速生成测试数据库的原型工具&#xff0c;用户输入应用类型&#xff08;如博客系统、CRM等&#xff09;后&#xff1a;1) 自动生成3-5张关联表的CREATE TABLE语句 2) 为每…

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

Qwen3-14B本地部署指南:从镜像下载到生产优化

Qwen3-14B本地部署实战&#xff1a;从零搭建企业级AI推理服务 你有没有过这样的经历&#xff1f;花了几周时间调研大模型&#xff0c;终于选定了一个参数够大、性能榜单靠前的明星产品&#xff0c;结果一上手才发现——显存爆了、延迟高得没法用、API调不通&#xff0c;更别说…

作者头像 李华
网站建设 2026/6/22 21:25:25

火山引擎AI大模型API对接Anything-LLM的混合调用策略

火山引擎AI大模型API对接Anything-LLM的混合调用策略 在企业知识管理日益智能化的今天&#xff0c;一个现实问题反复浮现&#xff1a;我们既希望系统具备强大的语言理解与生成能力&#xff0c;又不能牺牲数据安全和响应效率。许多团队尝试部署本地大模型来处理文档问答&#xf…

作者头像 李华