这两天刚看了一部电影
片名叫神探
这部电影讲述的是:
一位患有人格分裂能看清人内心的鬼的天才警察
受另一位警察所托去调查一件神秘案件的故事
电影的结局是我觉得最出人意料的地方
我这儿就不剧透了
真的是看得我震惊
另外补充一点:
刘青云真的是演技炸裂,炸到爆!!!
一个人撑起了一部戏!
93-复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
["255.255.11.135", "255.255.111.35"]
思路:
这道题目描述的很简单,用到的方法也是我们比较熟悉的回溯法。看了网上大佬的分享,好似这道题与前面的第17题电话号码的字母组合比较类似,大家也可以看看我前面写的这篇文章。
https://blog.csdn.net/weixin_36431280/article/details/84200845
关于回溯法,我前面也写了一篇关于回溯法的文章,还是比较通俗易懂的,大家也可以看看。
https://blog.csdn.net/weixin_36431280/article/details/84891567
关于此题,我觉得只要抓住三点即可。
- 给定的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)
不过执行效率还是很低,有点郁闷!!!