这是我参与2022首次更文挑战的第40天,活动详情查看:2022首次更文挑战」
复原 IP 地址 Recover IP Address
LeetCode传送门 93. 复原 IP 地址
题目
有效 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 中的任何数字。你可以按 任何 顺序返回答案。
A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros.
For example, "0.1.2.201" and "192.168.1.1" are valid IP addresses, but "0.011.255.245", "192.168.1.312" and "192.168@1.1" are invalid IP addresses. Given a string s containing only digits, return all possible valid IP addresses that can be formed by inserting dots into s. You are not allowed to reorder or remove any digits in s. You may return the valid IP addresses in any order.
Example:
Input: s = "25525511135"
Output: ["255.255.11.135","255.255.111.35"]
Input: s = "0000"
Output: ["0.0.0.0"]
Input: s = "101023"
Output: ["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
Constraints:
1 <= s.length <= 20sconsists of digits only.
思考线
解题思路
由于是找所有可能的ip地址,我们可以使用 回溯的办法来做这道题。
题目中给出的字符串为s, 我们用深度递归函数 dfs(s, id, start)表示我们正从s[start]的位置开始,搜索ip地址中的第id段。由于ip地址的每一段必须是[0, 255]中的整数,因此 我们从start开始,从小到大依次枚举当前段的可行地址。 如果满足就递归调用dfs(s, id, start).
根据上面的思路,代码如下:
function restoreIpAddresses(s: string): string[] {
const counts = 4;
const ipArr = [];
const res = [];
const len = s.length
function dfs(s: string, id: number, start: number) {
// 计算到第4段ip
if (id === counts) {
// 符合, 放入res
if (start === len) res.push(ipArr.join('.'))
// s还有多余字符,不符合,退出
return
}
// 如果提前s被用完
if (start === len) return
// 对'0'的特殊处理
if (s[start] === '0') {
ipArr[id] = 0;
dfs(s, id + 1, start + 1)
}
// 枚举
let addr = 0;
for(let i = start; i < len; i++) {
addr = addr *10 + Number(s[i]);
if(addr <=255 && addr > 0) {
ipArr[id] = addr;
dfs(s, id + 1, i + 1);
} else {
break;
}
}
}
dfs(s, 0, 0)
return res;
};
时间复杂度
: 其中n为字符串s的长度。
这就是我对本题的解法,如果有疑问或者更好的解答方式,欢迎留言互动。