总结
经典的回溯算法。
对所有可能的字符串分隔方式进行搜索,并筛选出满足要求的作为答案。
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例1:
1 | 输入:s = "25525511135" |
示例2:
1 | 输入:s = "0000" |
示例3:
1 | 输入:s = "101023" |
提示:
1 <= s.length <= 20s仅由数字组成
思路与算法
1、首先,定义一个递归函数 restoreIpAddresses,该函数接收以下参数:原始字符串 s、当前正在构建的IP地址 current、已经构建的IP地址部分数量 count、结果集 result。
2、在 restoreIpAddresses 函数中,首先检查是否已经构建了4个IP地址部分,如果是,则判断是否已经遍历完整个字符串 s,如果是,则将 current 加入到结果集 result 中。
3、如果还没有构建完4个IP地址部分,则进行以下操作:
- 使用一个循环遍历,从当前位置开始,尝试截取长度为1、2或3的子串作为一个IP地址部分。
- 对于每个尝试的子串,需要满足以下条件才能继续递归构建IP地址:
- 子串的长度大于0且小于等于3。
- 如果子串长度大于1,那么子串不能以0开头。
- 子串表示的数值必须在0到255之间。
- 如果满足条件,则将该子串加入到当前正在构建的IP地址
current中,并递归调用restoreIpAddresses,同时更新count值加1。 - 在递归调用返回后,需要将当前尝试的子串从
current中移除,以便尝试下一个可能的子串。
4、最后,返回结果集 result。
通过以上步骤,递归函数将会生成所有可能的合法IP地址组合,并将其存储在结果集中返回。
1 |
|
复杂度分析
- 时间复杂度:
- 空间复杂度: