力扣练习——37 复原IP地址

1.问题描述

给定一个只包含数字的字符串,复原它(在中间插入点号)并返回所有可能的 IP 地址格式,输出可能的格式的数量。

 

有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间)组成,整数之间用 '.' 分隔。

 

示例:

输入: "25525511135"

输出: 2

说明:因为可能的IP地址包括:["255.255.11.135", "255.255.111.35"]

 

2.输入说明

输入一个只包含数字的字符串

3.输出说明

输出一个整数

4.范例

输入

25525511135

输出

2

5.代码

#include <iostream>
#include <queue>
#include <cstdlib>
#include <string>
#include<set>
using namespace std;

vector<string> ans;
vector<string> path;    // 保存ip地址的每一个段
int n;

//检查IP段是否合法
bool check(string num) {
    // 检测前导0
    if (num.size() > 1 && num[0] == '0') 
        return false;  
    //stoi 实现string to integer
    return stoi(num) <= 255;    // 每个部分均小于等于255
}

void backtracking(string s, int start, int cnt) {

    if (cnt == 4 && start == n) {
        if (start < n) return;  // 已经有四段了,但数字没有用完,剪枝
        ans.push_back(path[0] + '.' + path[1] + '.' + path[2] + '.' + path[3]);
        return;
    }

    for (int len = 1; len <= 3 && start + len - 1 < n; len++) {  // 每个数字部分位数 1-3
        string num = s.substr(start, len);
        if (check(num)) {
            path.push_back(num);
            backtracking(s, start + len, cnt + 1);
            path.pop_back();
        }
    }
}



vector<string> restoreIpAddresses(string s)
{
    n = s.size();
    if (n > 12) return ans; // 最多12位
    backtracking(s, 0, 0);
    return ans;
}

int main()

{

    vector<string>res;
    string s;
    cin >> s;
    res = restoreIpAddresses(s);
    cout << res.size() << endl;
    return 0;

}

 

posted @ 2022-07-25 16:44  努力奋斗的小企鹅  阅读(75)  评论(0)    收藏  举报