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

力扣93题:复原 IP 地址

力扣93题:复原 IP 地址(C语言实现详解)

题目描述

给定一个只包含数字的字符串 s,复原它并返回所有可能的 IP 地址格式。

有效的 IP 地址需满足以下条件:

  1. IP 地址由四个整数(每个整数位于 0 到 255 之间)组成,用 ‘.’ 分隔;
  2. 每个整数不能包含前导零(如 “01” 是无效的,但 “0” 是有效的)。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

解题思路

此题可以通过回溯算法解决。

  1. 状态定义:
    每次递归处理当前字符串片段,尝试将其分割为一个有效的 IP 地址部分。

  2. 剪枝条件:

    • 剩余的字符长度不够或过长,直接返回。
    • 当前片段值不在 0 到 255 之间,或者包含前导零时,跳过该分支。
  3. 递归结束条件:
    当找到 4 个有效的 IP 地址段且遍历完整个字符串时,将结果加入解集中。


C语言实现

以下是基于上述思路的代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 辅助函数:检查字符串是否为合法的 IP 段
int isValidSegment(const char *s, int start, int end) {if (start > end) return 0;// 如果有前导零且长度大于 1,则无效if (s[start] == '0' && start < end) return 0;// 计算数字值int num = 0;for (int i = start; i <= end; i++) {if (s[i] < '0' || s[i] > '9') return 0; // 非数字num = num * 10 + (s[i] - '0');if (num > 255) return 0; // 超出范围}return 1;
}// 回溯函数
void backtrack(char *s, int start, int segment, char *currentIP, int currentLen, char **result, int *returnSize) {int n = strlen(s);// 如果找到 4 段且刚好用完所有字符if (segment == 4 && start == n) {currentIP[currentLen - 1] = '\0'; // 去掉末尾的 '.'result[*returnSize] = strdup(currentIP); // 保存结果(*returnSize)++;return;}// 剩余字符不足或超出范围,剪枝if (segment == 4 || start == n) return;// 尝试分割 1 到 3 个字符作为当前段for (int len = 1; len <= 3; len++) {if (start + len - 1 >= n) break; // 超出字符串范围if (!isValidSegment(s, start, start + len - 1)) continue; // 非法段// 在 currentIP 中添加当前段strncpy(currentIP + currentLen, s + start, len);currentIP[currentLen + len] = '.'; // 添加 '.'// 递归处理下一段backtrack(s, start + len, segment + 1, currentIP, currentLen + len + 1, result, returnSize);}
}// 主函数
char **restoreIpAddresses(char *s, int *returnSize) {*returnSize = 0;int n = strlen(s);// 最多 27 个有效 IP(假设最大输入为 "255255255255")char **result = (char **)malloc(27 * sizeof(char *));char currentIP[20]; // 暂存当前 IPif (n < 4 || n > 12) return result; // 长度不合法,直接返回backtrack(s, 0, 0, currentIP, 0, result, returnSize);return result;
}// 测试函数
int main() {char s[] = "25525511135";int returnSize;char **result = restoreIpAddresses(s, &returnSize);printf("有效的 IP 地址有:\n");for (int i = 0; i < returnSize; i++) {printf("%s\n", result[i]);free(result[i]); // 释放内存}free(result); // 释放内存return 0;
}

测试用例

示例 1

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2

输入:s = "0000"
输出:["0.0.0.0"]

示例 3

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

代码解析

1. 校验合法性函数

int isValidSegment(const char *s, int start, int end) {if (start > end) return 0;if (s[start] == '0' && start < end) return 0; // 前导零int num = 0;for (int i = start; i <= end; i++) {if (s[i] < '0' || s[i] > '9') return 0; // 非数字num = num * 10 + (s[i] - '0');if (num > 255) return 0; // 超范围}return 1;
}

2. 回溯处理

void backtrack(char *s, int start, int segment, char *currentIP, int currentLen, char **result, int *returnSize) {if (segment == 4 && start == strlen(s)) {currentIP[currentLen - 1] = '\0';result[*returnSize] = strdup(currentIP);(*returnSize)++;return;}if (segment == 4 || start == strlen(s)) return;for (int len = 1; len <= 3; len++) {if (start + len - 1 >= strlen(s)) break;if (!isValidSegment(s, start, start + len - 1)) continue;strncpy(currentIP + currentLen, s + start, len);currentIP[currentLen + len] = '.';backtrack(s, start + len, segment + 1, currentIP, currentLen + len + 1, result, returnSize);}
}

复杂度分析

  1. 时间复杂度:
    每次递归最多有 3 4 3^4 34 种可能,字符串校验时间为 O ( 1 ) O(1) O(1),故总时间复杂度为 O ( 3 4 ) O(3^4) O(34)

  2. 空间复杂度:
    递归调用栈深度为 O ( 4 ) O(4) O(4),临时数组存储 IP 地址段,额外空间复杂度为 O ( n ) O(n) O(n)

相关文章:

力扣93题:复原 IP 地址

力扣93题&#xff1a;复原 IP 地址&#xff08;C语言实现详解&#xff09; 题目描述 给定一个只包含数字的字符串 s&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址需满足以下条件&#xff1a; IP 地址由四个整数&#xff08;每个整数位于 0 到 255 之间…...

mock.js介绍

mock.js http://mockjs.com/ 1、mock的介绍 *** 生成随机数据&#xff0c;拦截 Ajax 请求。** 通过随机数据&#xff0c;模拟各种场景&#xff1b;不需要修改既有代码&#xff0c;就可以拦截 Ajax 请求&#xff0c;返回模拟的响应数据&#xff1b;支持生成随机的文本、数字…...

React开发 - 技术细节汇总一

React简介 React 是一个声明式&#xff0c;高效且灵活的用于构建用户界面的 JavaScript 库。使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面&#xff0c;这些代码片段被称作“组件”。 ui render (data) -> 单向数据流 MVC // model var myapp {}; // …...

【论文复现】分割万物-SAM

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 分割万物-SAM 介绍原理分割任务任务预训练zero-shot transfer相关任务 模型Image EncoderPrompt EncoderMask Eecoder消除歧义高效Loss 和训…...

实现RAGFlow-0.14.1的输入框多行输入和消息框的多行显示

一、Chat页面输入框的修改 1. macOS配置 我使用MacBook Pro&#xff0c;chip 是 Apple M3 Pro&#xff0c;Memory是18GB&#xff0c;macOS是 Sonoma 14.6.1。 2. 修改chat输入框代码 目前RAGFlow前端的chat功能&#xff0c;输入的内容是单行的&#xff0c;不能主动使用Shift…...

Pointnet++改进71:添加LFE模块|高效长距离注意力网络

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入LFE模块,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理…...

C++STL容器vector容器大小相关函数

目录 前言 主要参考 vector::size vector::max_size vector::resize vector::capacity vector::empty vector::reserve vector::shrink_to_fit 共勉 前言 本文将讨论STL容器vector中与迭代器相关的函数&#xff0c;模板参数T为int类型。 主要参考 cpluscplus.com 侯…...

阿里云CPU超载解决记录

现象&#xff1a;阿里云CPU使用率超90%连续5分钟告警&#xff0c;项目日志error.log中存在heap/gc/limit等内存耗尽等信息&#xff0c;阿里云慢查询日志每日有查询时间很长的参数一直不变的慢sql&#xff0c;linux服务器使用top命令并按c可以看到cpu过大是哪个命令行造成的 分…...

【工具变量】上市公司企业商业信用融资数据(2003-2022年)

一、测算方式&#xff1a;参考《会计研究》张新民老师的做法 净商业信用NTC(应付账款应付票据预收账款)-(应收账款应收票据预付账款)&#xff0c;用总资产标准化; 应付账款AP应付账款应付票据预收账款&#xff0c;用总资产标准化 一年以上应付账款比例LAP是企业一年以上(包括一…...

2024数字科技生态大会 | 紫光展锐携手中国电信助力数字科技高质量发展

2024年12月3日至5日&#xff0c;中国电信2024数字科技生态大会在广州举行&#xff0c;通过主题峰会、多场分论坛、重要签约及合作发布等环节&#xff0c;与合作伙伴共绘数字科技发展新愿景。紫光展锐作为中国电信的战略合作伙伴受邀参会&#xff0c;全面呈现了技术、产品创新进…...

ES语法(一)概括

一、语法 1、请求方式 Elasticsearch&#xff08;ES&#xff09;使用基于 JSON 的查询 DSL&#xff08;领域特定语言&#xff09;来与数据交互。 一个 ElasticSearch 请求和任何 HTTP 请求一样由若干相同的部件组成&#xff1a; curl -X<VERB> <PROTOCOL>://&l…...

(vue)el-cascader多选级联选择器,值取最后一级的数据

(vue)el-cascader多选级联选择器&#xff0c;取值取最后一级的数据 获取到&#xff1a;[“养殖区”,“鸡棚”,“E5001”] 期望&#xff1a;[“E5001”] 问题: 解决方法 增加change事件方法&#xff0c;处理选中的value值 1.单选 <el-cascaderv-model"tags2":o…...

友思特方案 | 精密制程的光影贴合:半导体制造中的高功率紫外光源

导读 为新能源锂电行业赋能第四站&#xff1a;半导体制造中的高功率紫外光源&#xff01;稳定输出、灵活控制的曝光设备是新能源/半导体行业高端生产中减少误差、提高效率的核心技术&#xff0c;友思特 ALE 系列 UV LED 紫外光源集合6大优势&#xff0c;为精密制造的健康发展提…...

README写作技巧

做一个项目&#xff0c;首先第一眼看上去要美观&#xff0c;这样才有看下去的动力。做项目亦是如此&#xff0c;如果每一步应付做的话&#xff0c;我想动力也不会太大&#xff0c;最终很大概率会放弃或者进度缓慢。 1.README组成 README是对项目的一个说明&#xff0c;它对观看…...

【密码学】分组密码的工作模式

1.电码本模式&#xff08;ECB&#xff09; 优点: 每个数据块独立加密&#xff0c;可并行加密&#xff0c;实现简单。 缺点: 相同明文会产生相同密文&#xff0c;不具备数据完整保护性。 适用于短消息的加密传输 (如一个加密密钥)。 工作流程&#xff1a;用相同的密钥分别对…...

SQL 和 NoSQL 有什么区别?

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;和NoSQL数据库是两种不同类型的数据库管理系统&#xff0c;它们在多个方面存在显著的区别。以下是对SQL和NoSQL主要区别的详细分析&#xff1a; 一、数据存储与模型 SQL数据库 使用关系模型来…...

提升网站流量的关键:AI在SEO关键词优化中的应用

内容概要 在当今数字时代&#xff0c;提升网站流量已成为每个网站管理员的首要任务。而人工智能的技术进步&#xff0c;为搜索引擎优化&#xff08;SEO&#xff09;提供了强有力的支持&#xff0c;尤其是在关键词优化方面。关键词是连接用户需求与网站内容的桥梁&#xff0c;其…...

Harnessing Large Language Models for Training-free Video Anomaly Detection

标题&#xff1a;利用大型语言模型实现无训练的视频异常检测 原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2024/papers/Zanella_Harnessing_Large_Language_Models_for_Training-free_Video_Anomaly_Detection_CVPR_2024_paper.pdf 源码链接&#xff1a;ht…...

如何通过自学成长为一名后端开发工程师?

大家好&#xff0c;我是袁庭新。最近&#xff0c;有星友向我提出了一个很好的问题&#xff1a;如何通过自学成为一名后端开发工程师&#xff1f; 为了解答这个疑问&#xff0c;我特意制作了一个视频来详细分享我的看法和建议。 戳链接&#xff1a;如何通过自学成长为一名后端开…...

HDR视频技术之六:色调映射

图像显示技术的最终目的就是使得显示的图像效果尽量接近人们在自然界中观察到的对应的场景。 HDR 图像与视频有着更高的亮度、更深的位深、更广的色域&#xff0c;因此它无法在常见的普通显示器上显示。 入门级的显示器与播放设备&#xff08;例如普通人家使用的电视&#xff0…...

5个技巧快速掌握Happy Island Designer:免费在线岛屿设计工具终极指南

5个技巧快速掌握Happy Island Designer&#xff1a;免费在线岛屿设计工具终极指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(A…...

5分钟掌握XUnity自动翻译器:打破游戏语言障碍的终极指南 [特殊字符]

5分钟掌握XUnity自动翻译器&#xff1a;打破游戏语言障碍的终极指南 &#x1f3ae; 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍而错过心仪的游戏大作&#xff1f;XUnity自动翻译器…...

大多数癌症没有微生物组?Cell:有还是无,这是个问题

小编导读&#xff1a;这项发表于《Cell》的重磅研究对16,369个肿瘤全基因组进行了系统的微生物信号分析&#xff0c;开发并验证了名为PathSeq-T2T的宿主过滤与去污染流程。研究发现&#xff0c;大多数癌症类型的微生物信号在去污染后与背景无法区分&#xff0c;唯有口消化道癌&…...

LizzieYzy深度解析:专业围棋AI分析平台的实战进阶手册

LizzieYzy深度解析&#xff1a;专业围棋AI分析平台的实战进阶手册 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 在围棋AI技术日新月异的今天&#xff0c;如何将强大的计算能力转化为实用的分析工…...

LiveSplit速通计时器:5个核心功能提升你的游戏计时效率

LiveSplit速通计时器&#xff1a;5个核心功能提升你的游戏计时效率 【免费下载链接】LiveSplit A sleek, highly customizable timer for speedrunners. 项目地址: https://gitcode.com/gh_mirrors/li/LiveSplit LiveSplit是一款专为游戏速通玩家设计的专业计时器软件&a…...

初创团队如何利用 Taotoken 以更低成本试用多种大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初创团队如何利用 Taotoken 以更低成本试用多种大模型 对于初创团队和独立开发者而言&#xff0c;在产品原型验证阶段&#xff0c;…...

【效率革命】PolyWindow插件:从多边形到精美窗户的3dMax一键生成秘籍

1. 为什么你需要PolyWindow插件&#xff1f; 如果你经常用3dMax做建筑可视化或室内设计&#xff0c;肯定遇到过这样的烦恼&#xff1a;项目里需要做几十个风格各异的窗户&#xff0c;每个都要手动建模、分格、赋材质&#xff0c;光是想到这个工作量就让人头皮发麻。我去年接的一…...

DLSS Swapper终极指南:一键切换游戏超采样版本,免费提升帧率30%+

DLSS Swapper终极指南&#xff1a;一键切换游戏超采样版本&#xff0c;免费提升帧率30% 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾羡慕别人在《赛博朋克2077》里享受丝滑流畅的画面&#xff0c;而你的游戏…...

解锁你的音乐宝藏:ncmdump让网易云音乐文件自由播放

解锁你的音乐宝藏&#xff1a;ncmdump让网易云音乐文件自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你精心收藏的网易云音乐只能在特定客户端播放时&#xff0c;那种被束缚的感觉是否让你感到无奈&#xff1f;想象一下…...

δ - mem:提升大型语言模型内存效率,得分最高可达 1.31 倍!

快速通道可了解 arXiv 成为独立非营利组织的情况&#xff0c;也能直达康奈尔大学官网。同时&#xff0c;还能通过链接进行捐赠&#xff0c;支持 arXiv 的发展。搜索与导航提供了多种搜索途径&#xff0c;可在所有字段&#xff08;标题、作者、摘要等&#xff09;进行搜索。还有…...