从字符串恢复IP地址C++递归实现。

题目:

给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。
如:给出字符串 "25525511135",
所有可能的IP地址有两种:
 "255.255.11.135",

"255.255.111.35"
(顺序无关紧要)

代码:

#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <sstream>
using namespace std;
bool isValid(string s)//判断每一段是否合法。
{
    if(s.size() > 1 && s[0] == '0')//如果首位为0,则IP地址不合法。
        return false;
    int res = atoi(s.c_str());//将字符型的数组转化为数字型数组。
    return res <= 255 && res >= 0;
}

void DFS(string s, string tmp, int num, vector<string> &result)
{
    if(num == 3 && isValid(s))//递归结束条件。
    {
        result.push_back(tmp+s);//每完成一个结果就将结果加入到容器中。
        return;
    }

    //可以取1-3个字符
    for(int i = 1; i <= 3 && i < s.size(); ++i) //特别需要注意i<s.size()
    {
        string subs = s.substr(0, i);//顺序获取s中长度为i的字符串。
        if(isValid(subs))//如果这段合法,递归寻找下一段,直到所有4段都完成,即num=3,否则这一段位数加一再进行尝试。
            DFS(s.substr(i), tmp+subs+".", num+1, result);
    }
}

int main()
{

    string s;
    cout<<"请输入任意数字串: "<<endl;
    while(cin >> s)
    {
        vector<string> result;

        if(s.size() < 4 || s.size() > 12)//不符合IP地址要求
        {
            cout<<"输入IP地址不合法"<<endl;
            return 0;
        }
        DFS(s, "", 0, result);

        cout<<"共有"<<result.size()<<"个合法结果: "<<endl;
        for(int i = 0; i < result.size(); ++i)
        {
            cout<<"第"<<i+1<<"个结果为:";
            cout << result[i] << endl;
        }

    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouchenghao123/article/details/84204854