leecode 解题总结:93. Restore IP Addresses

来源:互联网 发布:艾弗森体测数据弹跳 编辑:程序博客网 时间:2024/06/03 17:56
#include <iostream>#include <stdio.h>#include <vector>#include <string>#include <sstream>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++){}}}输入:255255111350000010010输出:255.255.11.135, 255.255.111.30.0.0.00.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-1for(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<string> restoreIpAddresses(string s) {vector<string> 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-1for(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<string>& 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<string> result; while(cin >> value ) { result = solution.restoreIpAddresses(value); print(result); }}int main(int argc , char* argv[]){process();getchar();return 0;}

0 0
原创粉丝点击