LeetCode - Restore IP Addresses

本文探讨了如何通过深度优先搜索(DFS)解决给定数字字符串转化为有效IP地址的所有可能组合的问题。详细解释了算法的时间复杂度、空间复杂度以及限制条件,并提供了实现代码,帮助理解在字符串长度不超过12时,如何高效地生成所有合法的IP地址组合。

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

Restore IP Addresses

2013.12.31 18:06

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

Solution:

  Given a number string, find all of the possible IP address that it may represent in decimal form.

  Finding all possible answer means we usually have to do a search, either DFS or BFS. This problem can be properly solved with DFS.

  Time complexity is O(2^n), space compelxity is O(2^n) as well, where n is the length of the string.  Luckily the actual compelxity is much lower than 2^n, as each token in the ip address ranges in [0, 255], this natural limit helps us trim a lot of invalid search paths. By the way, the length n can be at most 12 (255.255.255.255), since the ip here only refers to IPv4, not including IPv6.

Accepted code:

 1 //#define __MAIN__
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <vector>
 7 using namespace std;
 8 
 9 class Solution {
10 public:
11     vector<string> restoreIpAddresses(string s) {
12         // Note: The Solution object is instantiated only once and is reused by each test case.
13         str = s.data();
14         slen = strlen(str);
15         res.clear();
16         if(slen > 12){
17             return res;
18         }
19         dfs(0, 0);
20         
21         return res;
22     }
23 private:
24     int slen;
25     int a[4];
26     vector<string> res;
27     const char *str;
28     char tmp[100];
29 
30     void dfs(int si, int ai) {
31         int i;
32         int num;
33         string snum;
34         
35         if(ai == 4){
36             if(si == slen){
37                 sprintf(tmp, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
38                 res.push_back(string(tmp));
39             }
40             return;
41         }
42         
43         if(si >= slen){
44             return;
45         }
46         
47         if(ai + (slen - si) / 3 > 4){
48             return;
49         }
50         
51         num = 0;
52         snum = "";
53         for(i = si; i < si + 3 && i < slen; ++i){
54             if(snum.length() > 0 && snum[0] == '0'){
55                 //cannot add more digits after leading 0
56                 break;
57             }
58             num = num * 10 + (str[i] - '0');
59             snum = snum + str[i];
60             if(num > 255){
61                 break;
62             }else{
63                 a[ai] = num;
64                 dfs(i + 1, ai + 1);
65             }
66         }
67     }
68 };
69 
70 #ifdef __MAIN__
71 #include <iostream>
72 int main()
73 {
74     Solution sol;
75     char str[100];
76     vector<string> res;
77     int i;
78 
79     while(gets(str) != NULL){
80         res = sol.restoreIpAddresses(string(str));
81         cout << "res_count = " << res.size() << endl;
82         for(i = 0; i < res.size(); ++i){
83             cout << res[i] << endl;
84         }
85         cout << endl;
86     }
87 
88     return 0;
89 }
90 #endif

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3499884.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值