力扣:复原ip地址

主要思想:回溯算法

题目描述:

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

  • 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245""192.168.1.312" 和 "[email protected]" 是 无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

解析:

第一次写博客纪念一下qaq

根据题目描述可以简化成在这些数字中插入三个"."的模型,那么我们就可以先确定第一个点的位置,如果合法的话再判断下一个点的位置,如果不合法就回溯。

判断是否合法就是很简单的将string转化成数字,再注意一下细节就好

时间复杂度O(\mathbb{C}\binom{k}{n}+k)

上代码

#include 
using namespace std;
string s;

bool isvalid(string s, int start, int end) // 判断从statr开始到第i是否合法
{
    if (end - start == 0) // 说明此时只有一个数字
    {
        if (s[start] == '0')
            return true;
    }
    else
    {
        if (s[start] == '0')
            return false;
        else
        {
            int sum = 0;
            for (int i = start; i <= end; i++)
            {
                sum = s[i] - '0' + sum * 10;
            }
            if (sum > 0 && sum <= 255)
                return true;
            else
                return false;
        }
    }
}

void racingback(string st, int start, int times)
{
    if (times == 3)
    {
        if (isvalid(st, start, st.length() - 1))
        {
            cout << st << endl;
        }
    }
    else
    {
        for (int i = start; i < st.length(); i++)
        {
            if (isvalid(st, start, i)) 
            {
                string newstring;
                newstring = st;
                newstring.insert(i + 1, ".");
                racingback(newstring, i + 2, times + 1);
            }
        }
    }
}

int main()
{
    cin >> s;
    racingback(s, 0, 0);
    return 0;
}

大佬们轻喷QAQ

你可能感兴趣的:(c++)