LeetCode 93 复原 IP 地址 - 回溯解法

LeetCode 93 复原 IP 地址 - 回溯解法

https://leetcode.cn/problems/restore-ip-addresses/description/

与[分割回文串](LeetCode 131 分割回文串 - 回溯解法.md) 类似, 不断的从前面拿到一个 合法的 **ip加入到path中, 直到走到最后. **

每回拿到的长度应该为 1-3
for(int len = 1;len<=3;len++){ 这里可能 index+len>max 也要限制一下
	left = loc.substr(index,len)
	if(left 合法){
		path.push(left)
		add_path(index+len)
		path.pop();
	}
}
返回条件和  回文串 一样
当前面都加到 path 中后, 此时就应该返回了.

代码


class Solution {

public:

    vector<string> path;

    vector<string> result;

    string loc_string;

    void add_path(int index) {

        if (path.size() > 4)

            return;

        if (index == loc_string.size() && path.size() == 4) {

            string tmp = path[0];

            for (int i = 1; i < 4; ++i) {

                tmp += '.' + path[i];

            }

            result.push_back(tmp);

            return;

        }

        for (int len = 1; len <= 3 && index + len <= loc_string.size(); len++) {

            string left = loc_string.substr(index, len);

            if (left[0] == '0' && len > 1) {
				// 这里 一旦触发 continue  后面的循环一定会continue, 可以直接 break.
                continue;

            }

            if(stoi(left)>255) break;

            path.push_back(left);

            add_path(index + len);

            path.pop_back();

        }

    }

    vector<string> restoreIpAddresses(string s) {

        loc_string = s;

        add_path(0);

        return result;

    }

};

总结

👍 将["225","2","33","55"]转换为225.2.33.55 时, 使用循环直接套四层循环不够美观, 注意到需要额外处理的位置只会出现在首尾, 因此可以直接令tmp 等于首部, 这样少一层循环且美观.

👍 处理break. 当第一个数为0时, 接下来的循环都是应该跳过的, 因此直接break; 当左边大于255时, 接下来的循环也一定大于255,因此直接break.