题目链接:
https://leetcode-cn.com/problems/restore-ip-addresses/
难度:中等
93. 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
题目不难 不过这并不妨碍我不会做 不得不承认 我对递归的理解太浅薄了 (说到底就是菜 )
确定递归的参数 字符串 当前是第几个数 从第几位开始
class Solution {
public:
static constexpr int SEG_COUNT = 4;
vector<string> ans;
vector<int> segments;
void dfs(const string&s,int segid,int segstart){
// 满足条件
// segid=4 表示已经有四个数了
// segstart=s.size() 表示正好到达s结尾
// segments取出(“.” 勿忘) 存入ans
if(segid==SEG_COUNT){
if(segstart==s.size()){
string ip="";
for(int i=0;i<SEG_COUNT;i++){
ip+=to_string(segments.at(i));
if(i!=SEG_COUNT-1){
ip += ".";
}
}
ans.push_back(move(ip));
}
return;
}
// 还没有到四个数就已经到末尾了
if(segstart==s.size()){
return;
}
// 若当前为0 则下一个
if(s.at(segstart)=='0'){
segments.at(segid)=0;
dfs(s,segid+1,segstart+1);
}
// addr当前数值
int addr = 0;
for(int i=segstart;i<s.size();++i){
addr=addr*10+(s.at(i)-'0');
if(addr>0&&addr<=0xFF){
segments[segid] = addr;
dfs(s,segid+1,i+1);
}else{
// 若不在<=255 再加上一位更大
// 直接跳出循环 此种情况的可能选择已经结束
break;
}
}
}
vector<string> restoreIpAddresses(string s) {
// 将过程中的数存入segments
segments.resize(SEG_COUNT);
dfs(s,0,0);
return ans;
}
};