1. 程式人生 > >從字串恢復IP地址C++遞迴實現。

從字串恢復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;
}