题目 :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)
思路:
体思路就是深度优先搜索,首先看到边界条件没,如果没有,就深度搜索:
一开始搜索1个字符和剩下的字符串,判断该字符的index是否越界了,对于剩下的字符串递归;
然后是2个字符和剩下的字符串,判断这2个字符的首字符是否是0,对于剩下的字符串递归;
然后是3个字符和剩下的字符串,判断这3个字符的首字符是否是0,并且这3个字符组成的数字是否小于等于255,对于剩下的字符串递归。
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> restoreIp;
string ip;
if(s.length()>12) return restoreIp;
dfsIp(s,0,0,ip,restoreIp);
return restoreIp;
}
//s数字字符串串
//start表示当前dfs到的s的下标
//ipNum表示ip地址的第几个数字,4.3.2.1里面4对应的ipNum为1,3对应的是2...
//ip记录可能的ip临时值
//restoreIp记录所有可能的ip
void dfsIp(string s, int start, int ipNum, string ip, vector<string> &restoreIp){
//判断结束条件,合理的情况
if(start == s.size() && ipNum == 4){
ip.resize(ip.size()-1); //去掉最后多于的.
restoreIp.push_back(ip);
return;
}
//判断结束条件,不合理的情况
if((s.size()-start)>(4-ipNum)*3) return ;
if((s.size()-start)<(4-ipNum)) return ;
//核心算法,dfs深度优先遍历,
//首先遍历ip字段长度为1的情况,其次遍历为2,最后遍历字段长度为3的
int num=0;
for(int i=start; i<start+3; i++){
num = num*10 + (s[i]-'0');
if(num<=255){
ip += s[i];
dfsIp(s,i+1,ipNum+1,ip+'.',restoreIp);
}
if(num==0){
break;
}
}
}
};