恢复IP地址

目的:掌握基本递归算法设计

内容:编写程序exp5-3.cpp,恢复IP地址。给定一个仅仅包含数字的字符串,恢复它的所有可能的有效IP地址。例如,给定字符串为“22522511135”,返回“225.225.11.135”和“225.225.111.35”(顺序可以任意)。

思路:首先要确定退出递归的条件有:

  • 扫描的迭代器大于字符串长度
  • 递归次数大于3
  • 截取的字符串的第一个字符为0并且后面还有字符
  • 截取的字符串数字大于255

然后判断是否要添加"."或者是递归次数等于3时把它放进result中,递归查找下一个可能出现的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cmath>
#include<stdlib.h>
#include <set>
using namespace std;
string s;
set <string> result;
void getIP(string temp,int st,int en,int time)//获取IP地址
{
    if(en>s.size())
        return ;
    if(time>3)
        return ;
    string sub=s.substr(st,en-st);
    if(sub[0]=='0'&&sub.size()>1)
        return ;
    int num=atoi(sub.substr(0,en-st).c_str());
    if(num>255)
        return ;
    temp+=sub;
    if(en!=s.size())
        temp+=".";
    else
    {
        if(time==3)
            result.insert(temp);
            return ;
    }
    getIP(temp,en,en+1,time+1);
    getIP(temp,en,en+2,time+1);
    getIP(temp,en,en+3,time+1);
}
void printfIP()//输出结果
{
    if(result.empty())
    {
        printf("输入不合法\n");
    }
    else
    {
        set <string>::iterator a;
        printf("可能有效的IP地址有:\n");
        for(a=result.begin();a!=result.end();a++)
            cout<<*a<<endl;
        result.clear();
    }
    return ;
}
int main()
{
    while(~printf("请输入需要恢复的IP地址:\n"))
    {
        int num;
        cin>>s;
        string temp="";
        getIP(temp,0,1,0);
        getIP(temp,0,2,0);
        getIP(temp,0,3,0);
        printfIP();
        printf("继续请输入1,退出操作请输入0\n");
        cin>>num;
        if(num==0)
            break;
        else
            continue;
    }
    return 0;
}
给定一个只包含数字的字符串,用以表示一个 IP 地址,要求恢复出所有可能的 IP 地址。这是一个典型的回溯算法问题,可以通过递归实现。具体步骤如下: 1. 定义一个数组 `segments`,用于存储 IP 地址的四个段; 2. 定义一个变量 `start`,表示当前处理到字符串的哪个位置; 3. 定义一个变量 `segmentCount`,表示已经处理了几个段; 4. 如果已经处理了四个段并且字符串已经处理完毕,则将 `segments` 中的四个段拼接成一个 IP 地址,并将其加入结果集; 5. 如果已经处理了四个段但字符串还没有处理完毕,则直接返回; 6. 如果还没有处理完四个段但字符串已经处理完毕,则直接返回; 7. 对于每个段,从 `start` 开始,枚举可能的结束位置,如果这个段合法,则将其加入 `segments` 数组中,并递归处理下一个段; 8. 处理完当前段后,需要将 `segments` 数组中的当前段删除,以便处理下一个可能的结束位置。 代码如下(Python实现): ```python class Solution: def restoreIpAddresses(self, s: str) -> List[str]: def backtrack(start: int, segmentCount: int): if segmentCount == 4: if start == n: ip = ".".join(str(seg) for seg in segments) res.append(ip) return if start == n: return if s[start] == "0": segments[segmentCount] = 0 backtrack(start + 1, segmentCount + 1) addr = 0 for end in range(start, n): addr = addr * 10 + int(s[end]) if 0 < addr <= 255: segments[segmentCount] = addr backtrack(end + 1, segmentCount + 1) else: break n = len(s) if n < 4 or n > 12: return [] segments = [0] * 4 res = [] backtrack(0, 0) return res ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值