标签:int 多个 stream str 思路 string 需要 nbsp size
审题很重要啊,对某些测试用例能否通过不清楚的时候还是先在RunCode里试一试得好。
我开始的时候没考虑0的情况,后来去考虑多个零的时候,我主观的认为零在前面的时候是要把它去掉变成合法的IP。
例如:“1000111”->“100.01.1.1”->“100.1.1.1”也是合法的IP,但其实题目认为不能去掉零,所以它是非法的情况。
我的思路大概是:
首先,将IP分为{第一个地址}.{第二个地址}.{第三个地址}.{第四个地址}
然后考虑点的位置来划分情况,第一个点从第一个字符的后面向后移动;
第二个点从第一个点的后一个位置开始向后移动,每次移动到最后时,第一个点在往后前进一步,第二个重新开始。
第三个点从后往前移动,当它到字符串尾的长度超过3(最大是255)时,算法结束了。
我在里面做了小小的优化,当第三个地址的长度大于3时,第一个点需要向前进一步,但是第二个点不用回到第一个点的后一位置,因为那样第三个地址一定非法。
1 class Solution {
2 public:
3 vector<string> restoreIpAddresses(string &str) {
4 int length = str.length();
5 vector<string> strs;
6 vector<int> dotPos(3);
7 vector<int>::iterator firstDot = dotPos.begin();//第一个点的位置
8 vector<int>::iterator lastDot = dotPos.begin();//第三个点的位置
9 vector<int>::iterator middleDot = dotPos.begin();//第二个点的位置
10 int dis_first_middle = 0, dis_middle_last = 0;
11 middleDot++;
12 advance(lastDot, 2);
13 *firstDot = 1;
14 *middleDot = 1;
15 *lastDot = length - 1;
16 do{
17 (*middleDot)++;
18 if (*middleDot - *firstDot > 3){//第二个地址的长度不能大于3
19 (*firstDot)++;
20 if (*firstDot > 3){
21 *firstDot = 1;
22 *middleDot = (*firstDot) + 3;
23 (*lastDot)--;
24 }
25 if (dis_middle_last <= 3)//当第三个地址的长度小于等于3时,第二个点才回到第一个点的后一位置
26 *middleDot = (*firstDot) + 1;
27 }
28 dis_first_middle = *middleDot - *firstDot;
29 dis_middle_last = *lastDot - *middleDot;
30 if (dis_first_middle < 4 && dis_middle_last < 4 && dis_first_middle > 0 && dis_middle_last > 0){
31 string s1 = str.substr(0, *firstDot);
32 int num = stringToInteger(s1);
33 if (s1.size() > 1 && s1.at(0) == 48) continue;//去掉前面是零的情况
34 if (*firstDot == 3){
35 if (num > 255) continue;
36 }
37 string s2 = str.substr(*firstDot, dis_first_middle);
38 num = stringToInteger(s2);
39 if (s2.at(0) == 48 && s2.size() > 1) continue;
40 if (dis_first_middle == 3){
41 if (num > 255) continue;
42 }
43 string s3 = str.substr(*middleDot, dis_middle_last);
44 num = stringToInteger(s3);
45 if (s3.size() > 1 && s3.at(0) == 48) continue;
46 if (dis_middle_last == 3){
47 if (num > 255) continue;
48 }
49 string s4 = str.substr(*lastDot, length - (*lastDot));
50 num = stringToInteger(s4);
51 if (s4.size() > 1 && s4.at(0) == 48) continue;
52 if (*lastDot + 3 <= length){
53 if (num > 255) continue;
54 }
55 string temp(s1 + "." + s2 + "." + s3 + "." + s4);
56 strs.push_back(temp);
57 }
58 } while (*lastDot + 3 >= length);
59 return strs;
60 }
61 private:
62 int stringToInteger(string s){//字符串转化为数字
63 istringstream istream(s);
64 int num;
65 istream >> num;
66 return num;
67 }
68 };
[LeetCode]Restore IP Addresses
标签:int 多个 stream str 思路 string 需要 nbsp size
原文地址:http://www.cnblogs.com/yeqluofwupheng/p/6661390.html