原题
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: “25525511135”
Output: [“255.255.11.135”, “255.255.111.35”]
解法
DFS + 回溯法.
有效的IP地址是四个0-155之间的数, 在主函数里, edge case是当s的长度大于12时, 返回空列表. 定义DFS函数, 当s的长度大于剩余ip地址的长度时, 直接返回. 回溯的条件是当s为空且path的长度时4时, 表示我们已经用完所有s的字符且找到了有效的IP地址, 此时将path加到res里. 函数主体是每次找1-3个字符, 检查它们是否合法, 如果合法, 再递归求剩余ip地址.
Time: O(n)
Space: O(n)
代码
class Solution(object):
def restoreIpAddresses(self, s):
"""
:type s: str
:rtype: List[str]
"""
def dfs(s, path, res):
if len(s) > (4-len(path))*3:
return
if not s and len(path) == 4:
res.append('.'.join(path))
return
for i in range(1, 4):
if len(s) < i:
continue
n = int(s[:i])
if str(n) == s[:i] and n <= 255:
dfs(s[i:], path+[s[:i]], res)
# base case
if len(s) > 12: return []
res = []
dfs(s, [], res)
return res