From : https://leetcode.com/problems/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)
Solution 1 :
判断点的位置。
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
int len = s.size();
vector<string> ips;
if(len<4 || len>12) return ips;
const string dot = ".";
for(int i=0; i<3 && i<len; i++) {
for(int j=i+1; j<i+4 && j<len; j++) {
for(int k=j+1; k<j+4 && k<len; k++) {
string a = s.substr(0, i+1);
string b = s.substr(i+1, j-i);
string c = s.substr(j+1, k-j);
string d = s.substr(k+1, len-k);
if(check(d) && check(c) && check(b) && check(a)) {
ips.push_back(a+dot+b+dot+c+dot+d);
}
}
}
}
return ips;
}
bool check(string& str) {
if(str=="" || str.size() > 3) return false;
if(str[0] == '0') return str.size()==1;
int v = stoi(str);
return v>0 && v<=255;
}
};
Solution 2:
dfs
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
int len = s.size();
vector<string> ips;
if(len<4 || len>12) return ips;
vector<string> pts;
add(ips, pts, s, 0);
return ips;
}
void add(vector<string> &ips, vector<string> &pts, string &s, int i) {
if(pts.size() >= 4) {
if(i==s.size()) {
const string dot = ".";
ips.push_back(pts[0]+dot+pts[1]+dot+pts[2]+dot+pts[3]);
}
return;
}
for(int k=i+1, len = s.size(); k<=len && k<i+4; k++) {
string pt = s.substr(i, k-i);
if(check(pt)) {
pts.push_back(pt);
add(ips, pts, s, k);
pts.pop_back();
}
}
}
bool check(string& str) {
if(str=="" || str.size() > 3) return false;
if(str[0] == '0') return str.size()==1;
int v = stoi(str);
return v>0 && v<=255;
}
};
public class Solution {
private final String dot = ".";
public List<String> restoreIpAddresses(String s) {
if (s.length() < 4 || s.length() > 12) {
return new ArrayList<String>();
}
List<String> ips = new ArrayList<String>();
add(s, 0, ips, new LinkedList<String>());
return ips;
}
private void add(String s, int i, List<String> ips, LinkedList<String> parts) {
if (parts.size() == 4) {
if (i == s.length()) {
Iterator<String> it = parts.iterator();
ips.add(it.next() + dot + it.next() + dot + it.next() + dot
+ it.next());
}
return;
}
for (int k = i + 1; k <= s.length() && k < i + 4; ++k) {
String pt = s.substring(i, k);
if (check(pt)) {
parts.addLast(pt);
add(s, k, ips, parts);
parts.removeLast();
}
}
}
private boolean check(String str) {
if (str == "" || str.length() > 3) {
return false;
}
if (str.charAt(0) == '0') {
return str.length() == 1;
}
int v = Integer.valueOf(str);
return v > 0 && v <= 255;
}
}