leecode 解题总结:93. Restore IP Addresses

#include 
#include 
#include 
#include 
#include 
using namespace std;
/*
问题:
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)

分析:对给定的字符串通过添加"."号,使其变成有效的ip,返回有效ip的所有结果。
之前有一道题目是统计字母到数字映射时,字母组成字符串的所有个数。之前是每次判断1到2位课呢个出现
的情况。现在应该是判断1到3位的有效情况。
何谓有效ip?这里是否考虑192等局域网的地址。如果不算。
那么如果是3位,需要在100~255之间
如果是2位,应该都可以的,10~99
如果是1位,应该是0~9
且至少是4位,数字,最多12位数字

如果是用递归的划分应该是可以的。但是如果划分到3个数字你是继续作为3个数字作为整体,还是
继续分割成1位数字或者两位数字,不行。

如果看作是在一群数字中插入3个点号,我只需要罗列所有点好可能插入的位置,然后判断
被点号分割的每个数字是否满足条件。
假设字符串长度为n,那么可选择的位置必定是从1开始,到n-1
用一个三层循环
for(int i = 1 ; i <= n -4 ; i++)
{
	for(int j = i + 1 ; j <= n - 3 ;j++)
	{
		for(int k = j + 1 ; k <= n - 2; k++)
		{
		}
	}
}

输入:
25525511135
0000
010010
输出:
255.255.11.135, 255.255.111.3
0.0.0.0
0.10.0.10, 0.100.1.0
关键:
1 报错。如果首位是0,那么长度只能为1;不能出现"01"这种情况
Input:
"010010"
Output:
["0.1.0.010","0.1.00.10","0.1.001.0","0.10.0.10","0.10.01.0","0.100.1.0","01.0.0.10","01.0.01.0","01.00.1.0","010.0.1.0"]
Expected:
["0.10.0.10","0.100.1.0"]

2 
//k表明是最后截取的位置,可以取到最后一个字符n-1
for(int k = j + 1 ; k <= n - 1; k++)
*/

class Solution {
public:
	//注意,不能出现00,010这种情况
	bool isValid(string& sNum)
	{
		if(sNum.empty() || sNum.size() > 3)
		{
			return false;
		}
		//如果首位是0,那么长度只能为1;不能出现"01"这种情况
		if('0' == sNum.at(0) && sNum.size() > 1 )
		{
			return false;
		}
		int num = atoi(sNum.c_str());
		if(0 <= num && num <= 255)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

    vector restoreIpAddresses(string s) {
		vector result;
		if(s.empty() || s.size() < 4 || s.size() > 12)
		{
			return result;
		}
		int n = s.size();
		string first;
		string second;
		string three;
		string four;
		bool isOk = false;
		//这里的i,j,k是位置
		for(int i = 1 ; i <= n - 3 ; i++)
		{
			for(int j = i + 1 ; j <= n - 2 ;j++)
			{
				//k表明是最后截取的位置,可以取到最后一个字符n-1
				for(int k = j + 1 ; k <= n - 1; k++)
				{
					//根据三个点号的位置来分割成4个字符串
					first = s.substr(0 , i);
					second = s.substr(i , j - i);
					three = s.substr(j , k - j);
					four = s.substr(k , n - k);;
					isOk = isValid(first) && isValid(second)
						&& isValid(three) && isValid(four);
					if(isOk)
					{
						stringstream stream;
						stream << first << "." << second << "." << three << "." << four;
						result.push_back(stream.str());
					}
				}
			}
		}
		return result;
    }
};

void print(vector& result)
{
	if(result.empty())
	{
		cout << "no result" << endl;
		return;
	}
	int size = result.size();
	for(int i = 0 ; i < size ; i++)
	{
		cout << result.at(i) << ", " ;
	}
	cout << endl;
}

void process()
{
	 Solution solution;
	 string value;
	 vector result;
	 while(cin >> value )
	 {
		 result = solution.restoreIpAddresses(value);
		 print(result);
	 }
}

int main(int argc , char* argv[])
{
	process();
	getchar();
	return 0;
}


你可能感兴趣的:(leecode)