leetcode Restore IP Addresses

将一个数字串转化成合法IP,  DFS,注意一些细节

class Solution {
public:

    vector<string> restoreIpAddresses(string s) {
    	vector<string> ans;
        dfs(ans, s, "", 0, 0);
        return ans;
    }
    void dfs(vector<string> &ans, string s, string str, int pos, int dep) {
        if (dep >= 4) {
            if (dep == 4 && pos == s.length()) ans.push_back(str);
        } else {
            for (int i = pos; i < s.length(); i++) {
                string sub = s.substr(pos, i-pos+1);
                if (sub.length() <= 3 && stoi(sub) >= 0 && stoi(sub) <= 255 &&
                    to_string(stoi(sub)) == sub) {
                    string common = (dep == 3 ? "": ".");
                    dfs(ans, s, str+sub+common, i+1, dep+1);
                }
            }
        }
    }
    
    /**
     * vector<string> ans; //return all ips
     * string s;    // input string
     * string ip;   // 暂时存储
     * string pos;  // 但前起始坐标
     * string step; // ip地址中第几位数(4部分)
     * 在一段 字符串 或 数组 上分段提取,使用 dfs, dfs 可以加入 剪枝
     * 在这段数据上 搜索最小值,可以改成bfs
     */
    void dfs2(vector<string> &ans, string s, string ip, int pos, int step)
    {
    	if(pos == s.length() && step == 4){
    		//删除最后的点
    		ans.push_back(ip.substr(0,ip.size()-1));
    		return;
    	}
    	if(step > 4) return; //剪枝
    	//  if(s.szie() - i > (4-step) * 3) return; //更快
    	
    	for(int i=pos+1; i<=s.size(); i++)
    	{
    		string tmp = s.substr(pos, i-pos);
    		int val = stoi(tmp);
    		//ip地址0-255之间, 并且 前面不能出现0(022);
    		// stoi(string) , to_string(int), char* = c_str(string) 
    		if(tmp.length() <=3 && val >=0 && val <= 255 && to_string(val) == tmp){
    			dfs2(ans, s, ip+tmp+".",i,step+1);
    		}
    	}
    }
};

你可能感兴趣的:(LeetCode,DFS)