有效 IP 地址 正好由四个整数(每个整数位于 0
到 255
之间组成,且不能含有前导 0
),整数之间用 '.'
分隔。
- 例如:
"0.1.2.201"
和"192.168.1.1"
是 有效 IP 地址,但是"0.011.255.245"
、"192.168.1.312"
和"[email protected]"
是 无效 IP 地址。
给定一个只包含数字的字符串 s
,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s
中插入 '.'
来形成。你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000" 输出:["0.0.0.0"]
示例 3:
输入:s = "101023" 输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
1 <= s.length <= 20
s
仅由数字组成
DFS。
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
def check(s):
if not (0 <= int(s) <= 255):
return False
if s[0] == '0' and len(s) > 1:
return False
return True
def dfs(s, t):
if len(t) == 4:
if not s:
ans.append('.'.join(t))
return
for i in range(1, min(4, len(s) + 1)):
if check(s[:i]):
t.append(s[:i])
dfs(s[i:], t)
t.pop()
ans = []
dfs(s, [])
return ans
class Solution {
private List<String> ans;
public List<String> restoreIpAddresses(String s) {
ans = new ArrayList<>();
dfs(s, new ArrayList<>());
return ans;
}
private void dfs(String s, List<String> t) {
if (t.size() == 4) {
if ("".equals(s)) {
ans.add(String.join(".", t));
}
return;
}
for (int i = 1; i < Math.min(4, s.length() + 1); ++i) {
String c = s.substring(0, i);
if (check(c)) {
t.add(c);
dfs(s.substring(i), t);
t.remove(t.size() - 1);
}
}
}
private boolean check(String s) {
if ("".equals(s)) {
return false;
}
int num = Integer.parseInt(s);
if (num > 255) {
return false;
}
if (s.charAt(0) == '0' && s.length() > 1) {
return false;
}
return true;
}
}
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> ans;
vector<string> t;
dfs(s, t, ans);
return ans;
}
void dfs(string s, vector<string>& t, vector<string>& ans) {
if (t.size() == 4) {
if (s == "") {
string p = "";
for (auto e : t) p += e + ".";
p.pop_back();
ans.push_back(p);
}
return;
}
for (int i = 1; i < min(4, (int) s.size() + 1); ++i) {
string c = s.substr(0, i);
if (check(c)) {
t.push_back(c);
dfs(s.substr(i, s.size() - i), t, ans);
t.pop_back();
}
}
}
bool check(string s) {
if (s == "") return false;
int num = stoi(s);
if (num > 255) return false;
if (s[0] == '0' && s.size() > 1) return false;
return true;
}
};
func restoreIpAddresses(s string) []string {
check := func(s string) bool {
if i, _ := strconv.Atoi(s); i > 255 {
return false
}
if s[0] == '0' && len(s) > 1 {
return false
}
return true
}
var ans []string
var dfs func(s string, t []string)
dfs = func(s string, t []string) {
if len(t) == 4 {
if s == "" {
ans = append(ans, strings.Join(t, "."))
}
return
}
for i := 1; i < 4 && i < len(s)+1; i++ {
if check(s[0:i]) {
t = append(t, s[0:i])
dfs(s[i:], t)
t = t[0 : len(t)-1]
}
}
}
var t []string
dfs(s, t)
return ans
}