python复原_93. 复原IP地址(Python)

题目

难度:★★★☆☆

类型:字符串

方法:深度优先搜索

题目

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:

1 ≤ m ≤ n ≤ 链表长度。

示例

输入: 1->2->3->4->5->NULL, m = 2, n = 4

输出: 1->4->3->2->5->NULL

解答

有几种不同的办法解决这个问题。

方法1:笨办法,遍历

字符串中总共要被分割为4个部分,找到满足条件的分割可能性。

我们定义这四个部分分别是a,b,c和d,定义一个函数is_valid用来判断一个子串是否可以作为ip地址的一个部分,有两种情况,当只含有一个字符时,一定可以作为ip地址的一个部分,当不小于一个字符时,需要第一个字符不能为零,且整体字符转为数字的数值不能超过255。

从头开始遍历,要注意遍历的过程的始末条件,设i,j,k为三个分割点,根据这三个分割点实现嵌套循环,每个元素从1位到3位依次遍历,通过移动分割点的位置即可,当分割出来的元素不满足条件时,即可放弃这种方式。

class Solution1:

def restoreIpAddresses(self, s):

ans = []

n = len(s)

def is_valid(num):

return len(num) == 1 or (len(num) > 1 and num[0] != "0" and int(num) <= 255)

for i in range(0, min(3, n-3)):

a = s[:i+1]

if not is_valid(a):

break

for j in range(i+1, min(i+4, n-2)):

b = s[i+1:j+1]

if not is_valid(b):

break

for k in range(j+1, min(j+4, n-1)):

c = s[j+1:k+1]

d = s[k+1:]

if not is_valid(c):

break

if not is_valid(d):

continue

ans.append("{}.{}.{}.{}".format(a, b, c, d))

return ans

方法2:深度优先搜索

推荐这种方法。深度优先遍历可以通过递归实现,但是要在函数开头写清楚终止条件,定义函数,函数输入为剩余的字符串,当前的结果以及当前的分割列表,分别用s,res和path表示,本例的终止条件为剩余字符串s变成空字符串,且分割列表path中的元素正好含有4个,终止时需要将当前结果保留在结果列表res中。

如果当前不满足终止条件,需要进行遍历,遍历的对象是新增的单元,长度从1到3,但是在每次循环开始时,需要判断一下当前s中剩下的元素够不够新增单元的长度,如果不够,那么直接退出所有循环即可,通过这样的操作将结果可能性进行减枝。

深度优先搜索的条件是,当当前选中的单元满足成为ip地址一个部分的条件时,可以调用本函数进行深度优先搜索,这时的s应该为去掉本单元后剩余的字符串,res延续原来的数值,path中添加当前找到的单元。

class Solution:

def restoreIpAddresses(self, s):

def dfs(s, res, path):

if not s and len(path) == 4:

res.append('.'.join(path))

return

for i in range(1, 4):

if i > len(s):

break

num = int(s[:i])

if num <= 255:

dfs(s[i:], res, path + [s[:i]])

if len(s) < 4 or len(s) > 12:

return []

res = []

path = []

dfs(s, res, path)

return res

如有疑问或建议,欢迎评论区留言~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值