数字字符串转化成IP地址, 回溯

相当于是找满足IP要求的数字字符组排列,最容易想到的就是用回溯
基本要素1,终止条件:如果遍历到字符串末尾或者找出的字段数已经超过4
基本要素2:元素选择:在某一个位置,可以选一个数作为IP地址的一个字段,也可以选两个数作为IP地址的一个字段,但第一位数不能是0,还可以选三个数作为IP地址的一个字段,但第一位数不能是0,且三位数不大于255。
基本要素3:递推关系,如果当前字段选了一个数s[idx],那下一个字段就从s[idx+1]开始选,形成子问题。如果当前字段选了两个数s[idx:idx+2],那下一个字段就从s[idx+2]开始选,形成子问题。如果当前字段选了三个数s[idx:idx+3],那下一个字段就从s[idx+3]开始选,形成子问题。

class Solution:
    def restoreIpAddresses(self , s: str) -> List[str]:
        path = []
        res = []
        def backTracking(s, idx):
            if len(path)>4 or idx >= len(s):
                if len(path) == 4:
                    res.append('.'.join(path[:]))
                return 
            # 一位数
            path.append(s[idx])
            backTracking(s, idx+1)
            #两位数,首位不能为零
            if idx+1 < len(s) and s[idx]!='0':
                path[-1] = path[-1]+s[idx+1]
                backTracking(s, idx+2)
                # 三位数
                if idx+2 < len(s) and 0< int(s[idx:idx+3])<=255:
                    path[-1] = path[-1]+s[idx+2]
                    backTracking(s, idx+3)
            path.pop()
        backTracking(s, 0)
        return res