复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
["255.255.11.135", "255.255.111.35"]
思路:
这道题目描述的很简单,用到的方法也是我们比较熟悉的回溯法。
关于此题,我觉得只要抓住三点即可。
- 给定的IP 地址总长度必须要不小于4,不超过12。比如1.1.1.1以及255.255.255.255
- 给定的IP 地址肯定是要分成4个部分的,每个部分子串的长度不超过3,并且该子串值的大小在[0, 255]之间。
- 还有一种特殊情况,就是字串中包含0。比如“010010”这种情况,该IP 地址对应的标准地址为["0, 100, 1, 0", "0, 10, 0, 10"]也就是0不能省略了,即切割完的IP地址长度与原地址长度相等
理解了这三点,就很好写代码了。
代码如下:
class Solution(object):
# 本题采用回溯法解决
# 注意点:IP地址空缺位不补0
def restoreIpAddresses(self, s):
"""
:type s: str
:rtype: List[str]
"""
# 定义包含所有可能的IP地址的列表
address_list = []
if len(s) < 4 or len(s) > 12:
return address_list
# 核心的递归算法
def back(address=[], s=s):
if len(address) == 4 and len(s) == 0:
address_str = ".".join(address)
if address_str not in address_list:
address_list.append(address_str)
return
for index in range(3):
if len(s) >= index+1:
one_str = s[:index+1]
# 若出现"010010"情况,对于0的取舍需要着重考虑
# 关键一条就是:切割完的IP地址长度与原地址长度相等
if int(one_str) in range(256) and str(int(one_str)) == one_str:
one_str = str(int(one_str))
back(address+[one_str], s[index+1:])
back()
return address_list
if __name__ == "__main__":
s = "010010"
address = Solution().restoreIpAddresses(s)
print(address)
不过执行效率还是很低,有点郁闷!!!