1.题目:复原IP地址(题目来源:LeetCode 93题)
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
示例 1:
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000"
输出:["0.0.0.0"]
2.个人理解:
ICT一直是自己向往读研的研究所,毕竟计算所嘛~懂的都懂。但参加过计算所两个实验室的机试与面试后,认识到很多优秀的同学,深知自己在CS这条道路上还有很长的路要走。步入正题,当时看到这道题,笔者第一反应是剪枝法,剪枝的条件为ip地址xxx.xxx.xxx.xxx
中的满足xxx > 0 && xxx <=255
,但是由此进行暴力枚举然后根据剪枝条件进行剪枝时,如何控制循环边界,这就是笔者当时此题不能AC
的原因。而今日参考了Leetcode
解析时发现,此题还可以使用递归法,并且巧妙的使用 sed_id,seg_start,seg_count=4作为递归控制条件,当如下满足时:
// 核心算法
int addressPart = 0;
for (int i = seg_start; i < s.size(); i++) {
// 由递归枚举每一种可能
addressPart = addressPart * 10 + (s[i] - '0');
// 满足`xxx > 0 && xxx <=255`条件
if (addressPart > 0 && addressPart <= 255) {
segments