leetcode 93 Restore IP Addresses详解
Posted bitcarmanlee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 93 Restore IP Addresses详解相关的知识,希望对你有一定的参考价值。
1.题目
有效 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 中的任何数字。你可以按 任何 顺序返回答案。
示例:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
输入:s = “0000”
输出:[“0.0.0.0”]
输入:s = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]
提示:
1 <= s.length <= 20
s 仅由数字组成
2.思路分析
这是一个典型的递归+DFS问题。我们可以将问题看成在字符串中加入三个点将字符串分为四段,而且要求四段都必须合法,即每一段都为[0, 255]之间。同时,当每一段只有一位时,该位可以为0。而每一段不止一位时,不能以0开头。
以k表示需要分的段数,k初始值设为4。如果k减到0,则说明分段工作已完成。如果此时字符串刚好为空,说明该分法符合要求,可以加入结果。
3.c++代码
#include<iostream>
#include<vector>
using namespace std;
bool isValid(string s)
if (s.size() > 1 && s[0] == '0') return false;
return stoi(s) <= 255;
void dfs(string s, int k, string out, vector<string> &res)
if (k==0)
if (s.size() == 0) res.push_back(out);
else
for(int i=1; i<=3; i++)
if (s.size() >= i && isValid(s.substr(0, i)))
if (k==1) dfs(s.substr(i), k-1, out+s.substr(0, i), res);
else dfs(s.substr(i), k-1, out+s.substr(0, i)+".", res);
void run()
vector<string> vec;
// string s = "25525511135";
// string s = "101023";
string s = "0000";
dfs(s, 4, "", vec);
for(string ele: vec)
cout<<ele<<endl;
int main(int argc, char const *argv[])
run();
return 0;
上面的代码是直接将结果打印出来,如果需要改成题目的输出形式,只需要将对应的结果容器中的数据组织成对应的形式即可。
以上是关于leetcode 93 Restore IP Addresses详解的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 93. Restore IP Addresses
[leetcode]93. Restore IP Addresses还原IP地址
LeetCode-93-Restore IP Addresses
LeetCode93. Restore IP Addresses 面试题