leetcode 93. 复原IP地址

本文深入探讨了LeetCode上的一道经典算法题——复原IP地址。通过递归和回溯的方法,详细解析了如何从一个数字字符串中找出所有可能的IP地址格式。文章提供了完整的Python代码实现,并附带详细的注释,帮助读者理解算法背后的逻辑。
'''
leetcode 93. 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

计数问题:
算法:构造递归树,递归+回溯
'''
class Solution:
    def restoreIpAddresses(self, s: str):
        input_list=[i for i in s]
        output=[]
        for item in self.helper(input_list,4):
            output.append(''.join(list(map(lambda x:x+'.',item)))[:-1])
        return output

    def helper(self,input_list,num):
        # 从字符串列表input_list中构造出长度为num的地址
        '''
        :param input_list: 输入必须是字符列表,列表中的每个元素是一个字符
        :param num: 根据上述的字符串列表中按顺序构造出长度为多少的字符列表(列表中的每个元素可以是字符串或字符)
        :return: 二维列表
        '''
        # print(input_list,num)
        if len(input_list)==0:
            return []
        if num==0:
            return []
        if len(input_list) < num:
            return []
        if len(input_list) == num:
            return [input_list]
        if num==1:
            if len(input_list)>3:
                return [[]]
            if len(input_list)==2:
                if input_list[0]=='0':
                    return [[]]
                else:
                    # print('jfidsjifd',input_list,[input_list[0]+input_list[1]])
                    return [[input_list[0]+input_list[1]]]
            if len(input_list)==3:
                if input_list[0]!='0' and int(input_list[0]+input_list[1]+input_list[2])<=255:
                    return [[input_list[0]+input_list[1]+input_list[2]]]
                else:
                    return [[]]

        result=[]
        temp=input_list[0]
        for right_seq in self.helper(input_list[1:],num-1):
            if len(right_seq) == num - 1:
                result.append([temp]+right_seq)

        if temp!='0' and len(input_list)>=2:
            temp=input_list[0]+input_list[1]
            for right_seq in self.helper(input_list[2:],num-1):
                # print('hsidahias',right_seq)
                if len(right_seq)==num-1:
                    result.append([temp]+right_seq)

        if len(input_list)>=3 and input_list[0]!='0' and int(input_list[0]+input_list[1]+input_list[2])<=255:
            temp=input_list[0]+input_list[1]+input_list[2]
            # print('here',temp)
            for right_seq in self.helper(input_list[3:],num-1):
                # print('skdfkdspfds',right_seq)
                if len(right_seq) == num - 1:
                    # print('tight')
                    result.append([temp]+right_seq)
        # print(input_list, num)
        # print(result)
        return result

if __name__=="__main__":
    print(Solution().restoreIpAddresses("10269"))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值