Description:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Note:
For example:
Given "25525511135"
,return ["255.255.11.135",
"255.255.111.35"]
. (Order does not matter)
Solution:
Analysis and Thinking:
使用分治的思想,通過將原始問題不斷縮減爲同類性質的小問題,逐一解決,最後再把所有解答集成形成最終答案。這裏我們可以用'.'作爲分割的標誌,將一個初始輸入的字符串分割成4個子段,並且能通過4個子段組合成一個符合規定的IP地址。其中每一個子段可能包含1位、2位、或者3位,因此最終需要分類討論。
Steps:
1.判斷輸入字符串是否已被全部遍歷,且生成了4個段,如果是,停止函數並返回
2.判斷字符串總長度是否大於規定的長度,如果是,返回
3.如果輸入的字符串只包含1個字符,則加入該字符,且將位置標誌加1,子段數量加1,調用自身函數
4.如果輸入的字符串包含2個字符,加入這2個字符,將位置標誌加2,子段數量加1,調用自身函數
5.如果輸入的字符串包含3個字符,加入這3個字符,將位置標誌加3,子段數加1,調用自身函數
Codes:
class Solution
{
public:
void ipAddress_solution(string &s,int stringSize,int pos,string &record,vector<string> &result)
{
if(s.size()-pos>3*(4-num))
return;
if(pos==s.size()&&stringSize==4)
{
result.push_back(record.substr(0,path.size()-1));
return;
}
if(pos<s.size())
{
record=record+s.substr(pos,1)+".";
ipAddress_solution(s,stringSize+1,pos+1,record,result);
record=record.substr(0,record.size()-2);
}
if(pos<s.size()-1&&s[pos]!='0')
{
record=record+s.substr(pos,2)+".";
ipAddress_solution(s,stringSize+1,pos+2,record,result);
record=record.substr(0,record.size()-3);
}
if(pos<s.size()-2&&s[pos]!='0'&&s.substr(pos,3)<="255")
{
record=s.substr(pos,3)+".";
ipAddress_solution(s,stringSize+1,pos+3,record,result);
record=record.substr(0,record.size()-4);
}
}
vector<string> restoreIpAddress(string s)
{
vector<string> result;
string record;
ipAddress_solution(s,0,0,record,result);
return result;
}
};
Results: