Restore IP Addresses---LeetCode

本文介绍了一种使用DFS深度优先搜索的算法来解析字符串并找出所有可能的IP地址组合。通过递归函数实现,确保每部分IP的有效性,并利用回溯法进行遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:输入一串字符串,输出可能组成的ip地址。

 

先申请题意,弄清需求:

会存在不是数字的字符串吗?===都是数字

10.10.10.01 最后一个01,符合要求吗?====不符合要求。

leetcode上的示例答案:用的DFS

class Solution1 {
public:
	vector<string> restoreIpAddresses(string s) {
		vector<string> res;
		vector<string> tmp;
		int count = 0;
		int n = s.length();
		solve(res, tmp, s, 0, 0, n);
		return res;
	}
	// res 存的 是每次找到的有效的最终 ip 地址,即结果
	// tmp 存的 某次查找的时候 ,每个 ip 段,最终ip 由 四段组成。
	// s	 即输入字符串一直没变
	// count 表示当前 tmp 中的 ip段 个数
	// start 表示 从s的位置索引开始找有效ip部分
	// n	 表示 s的长度 一直不变
	void solve(vector<string>& res, vector<string>& tmp, string& s, int count, int start, const int n)
	{
		if (count == 4)
		{
			if (start == n)
			{
				string t = "";
				for (int i = 0; i < 3; i++)
				{
					t += tmp[i] + ".";
				}
				t += tmp[3];
				res.push_back(t);
			}
			return;
		}
		if (start == n)
		{
			return;
		}
		for (int i = start; i < n; i++)
		{
			if (i + 1 - start > 3)
			{
				return;
			}
			string t = string(s.begin() + start, s.begin() + i + 1);
			if (t.length() > 1 && t[0] == '0')
			{
				return;
			}
			int e = stoi(t);
			if (e <= 255)
			{
				count++;
				tmp.push_back(t);
				solve(res, tmp, s, count, i + 1, n);
				count--;
				tmp.pop_back();
			}
		}
	}
};

分析:

1.从前往后找,使用tmp进行暂存,如果已经找到四个ip段了,看是否正好走完string,如果是就存入res,否则不存入。使用回溯的方法进行继续查找。

2.int e = stoi(t);  string转int的函数。 C++11中的增加的。

3.string t = string(s.begin() + start, s.begin() + i + 1); 使用迭代器进行初始化

template <class InputIterator>
  string  (InputIterator first, InputIterator last);

 

 

 

自己写的没贴代码了,就注意点:

    1. stringstream  类所在头文件 <sstream>

    2. bug:没有判断 strlen - i 是否大于等于0。导致数组越界。

     string strCur = string(s, strlen - i, i);

    3. bug:比如 12.7.0.01 这个ip的第四部分”01“不合法,应该排除掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ivy_0709

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值