【leetcode】Restore IP Addresses (middle)

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

 

思路:回溯法 解向量X={str0, str1, str2, str3} 分别是IP地址的四段

判断每个解向量的部分时,先求出该部分最长和最短长度(根据后面每段最少1位,最多3位),回溯求解。符合条件时就把X按照要求的格式压入ans.

注意,判断每个部分是否有效时要排除00,01,001...等0开头的情况。

#include <iostream>

#include <vector>

#include <algorithm>

#include <queue>

#include <stack>

using namespace std;



class Solution {

public:

    vector<string> restoreIpAddresses(string s) {

        vector<string> ans;

        int len = s.length();

        if(len < 4)

            return ans;

        

        vector<string> X(4, "");

        vector<vector<string>> S(4, vector<string>());

        int k = 0;

        int maxlen = min(3, len - 3 * 1);

        int minlen = max(1, len - 3 * 3);

        for(int i = minlen; i <= maxlen; i++)

        {

            string sub = s.substr(0, i);

            if(isVaildIP(sub))

            {

                S[0].push_back(sub);

            }

        }



        while(k >= 0)

        {

            while(!S[k].empty())

            {

                X[k] = S[k].back();

                S[k].pop_back();

                if(k < 3)

                {

                    k = k + 1;

                    int startloc = 0;

                    for(int j = 0; j < k; j++)

                    {

                        startloc += X[j].length();

                    }

                    int maxlen = min(3, len - (4 - k - 1) * 1 - startloc);

                    int minlen = max(1, len - (4 - k - 1) * 3 - startloc);

                    for(int i = minlen; i <= maxlen; i++)

                    {    

                        string sub = s.substr(startloc, i);

                        if(isVaildIP(sub))

                        {

                            S[k].push_back(sub);

                        }

                    }

                }

                else

                {

                    ans.push_back(X[0]);

                    for(int i = 1; i < 4; i++)

                    {

                        ans.back().append(".");

                        ans.back().append(X[i]);

                    }

                }

            }

            k--;

        }



        return ans;

    }



    bool isVaildIP(string snum)

    {

        if(snum.size() > 1 && snum[0] == '0')

            return false;

        int num = atoi(snum.c_str());

        return (num >= 0 && num <= 255);

    }

};



int main()

{

    Solution s;

    string num =/* "25525511135"*/"010010";

    vector<string> ans = s.restoreIpAddresses(num);



    return 0;

}

 

你可能感兴趣的:(LeetCode)