LeetCode 复原IP地址(回溯法、穷举法)

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

思路分析:由于IP地址是32位二进制,分成四个段(每个段8位二进制),则每个段的取值范围位(0~255)。从字符串上来看,每个段的长度是1到3位。并且如果有一个段的长度大于1,则其第一位不能是“0”,形如“023”这个段就不合法。
方法一:回溯法。每次搜索一个合法的段,如果四个段都合法就保存。

class Solution {
public:
	vector<string> strs;//用于存放临时的四个段
	vector<string> result;//存放结果
	void dfs(string &s, int beginIndex, int step) {
		if (step == 4 && beginIndex == s.size()) {//搜索成功
			string temRec = strs[0] + "." + strs[1] + "." + strs[2] + "." + strs[3];
			result.push_back(temRec);
		}
		else if (step < 4){//当还需要搜索
			for (int len = 1; len < 4; ++len) {//对这个段的长度进行穷举
				if (beginIndex + len <= s.size()) {//判断下标的合法性
					strs[step] = s.substr(beginIndex, len);//获取这个段
					//检测strs[step]这个段的合法性
                    //是否是“023”长度大于1且首位位0这种  或者“345”这种超过防伪
					if ((strs[step][0] == '0' && strs[step].size() > 1) || stoi(strs[step]) > 255) {
						continue;
					}
					dfs(s, beginIndex + len, step + 1);//进行下一步搜索
				}
			}
		}
	}

	vector<string> restoreIpAddresses(string s) {
		strs = vector<string>(4);
		dfs(s, 0, 0);//开始搜索
		return result;
	}
};

LeetCode 复原IP地址(回溯法、穷举法)_第1张图片
方法二:暴力的穷举法。

class Solution {
public:
	vector<string> restoreIpAddresses(string s) {
		vector<string> result;
		int strSize = s.size();
		if (strSize < 4) {
			return result;
		}
		for (int one = 1; one < 4; ++one) {//第一个段的长度
			for (int two = 1; two < 4; ++two) {//第二个段的长度
				for (int three = 1; three < 4; ++three) {//第三个段的长度
                    //第四个段的长度>=1 && < 4
					if (one + two + three < strSize && strSize - (one + two + three) < 4) {
						string s1 = s.substr(0, one);//获取第一个段
                        //如果第一个段是“010”第一个字符不能未零 这种或“256”、“789”这种超过了“255”
						if ((s1[0] == '0' && s1.size() > 1) || stoi(s1) > 255) {
							continue;
						}
                        //下面依次获取2、3、4段
						string s2 = s.substr(one, two);//获取第二个段
						if ((s2[0] == '0' && s2.size() > 1) || stoi(s2) > 255) {
							continue;
						}
						string s3 = s.substr(one + two, three);//获取第三个段
						if ((s3[0] == '0' && s3.size() > 1) || stoi(s3) > 255) {
							continue;
						}
						string s4 = s.substr(one + two + three);//获取第四个段
						if ((s4[0] == '0' && s4.size() > 1) || stoi(s4) > 255) {
							continue;
						}
                        //如果四个段全都合法
						string temRec = s1 + "." + s2 + "." + s3 + "." + s4;
						result.push_back(temRec);
					}
				}
			}
		}
		return result;
	}
};

LeetCode 复原IP地址(回溯法、穷举法)_第2张图片

你可能感兴趣的:(LeetCode,字符串,回溯法)