93.Restore IP Addresses
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)
这道题整了我很久,首先是一个老毛病犯了,又忘了区分字符'0'和数字0了,导致判断的时候出错,还有,最后结果的push
res.push_back( temp.substr(0,temp.size()-1));这样是对的,刚才出错是因为,temp=temp.substr(0,temp.size()-1);res.push_back(temp),这样子回溯的时候,会多删除一个。思路没错,就是因为这两个细节的错误导致这个程序调了很久。
整体思路就是深度优先搜索,首先看到边界条件没,如果没有,就深度搜索:
一开始搜索1个字符和剩下的字符串,判断该字符的index是否越界了,对于剩下的字符串递归;
然后是2个字符和剩下的字符串,判断这2个字符的首字符是否是0,对于剩下的字符串递归;
然后是3个字符和剩下的字符串,判断这3个字符的首字符是否是0,并且这3个字符组成的数字是否小于等于255,对于剩下的字符串递归。
class Solution {
private:
vector<string> ret;
vector<int> ipNums;
static const int ipNumCnt = 4;
static const int numLen = 3;
public:
bool isValidIpNum(string s)
{
int len = s.size();
if(len ==0 || len > 3)
{
return false;
}
if(len != 1 && s[0] == '0')
{
return false;
}
int num = stoi(s);
if(num>255)
{
return false;
}
return true;
}
void isSubstringValid(string s, int numCnt)
{
int len = s.size();
if(len == 0)
{
return;
}
if(numCnt == 4)
{
if(isValidIpNum(s))
{
ipNums.push_back(stoi(s));
string ip;
for(int i = 0; i < 4; i++)
{
int num = ipNums[i];
ip += to_string (num);
if(i != 3)
{
ip+='.';
}
}
ret.push_back(ip);
ipNums.pop_back();
}
}
else
{
int loopCnt = min(numLen, len);
for(int i =0; i < loopCnt; i++)
{
string num = s.substr(0,i+1);
if(isValidIpNum(num))
{
ipNums.push_back(stoi(num));
isSubstringValid(s.substr(i+1),numCnt+1);
ipNums.pop_back();
}
}
}
return ;
}
vector<string> restoreIpAddresses(string s) {
int len = s.size();
if(len <4|| len>12)
{
return ret;
}
stack<string> stk;
string ip;
int numCnt = 1;
for(int i = 0; i < 3;i++)
{
string num = s.substr(0,i+1);
if(isValidIpNum(num))
{
ipNums.push_back(stoi(num));
isSubstringValid(s.substr(i+1), numCnt+1);
ipNums.pop_back();
}
}
return ret;
}
};