(65)93. 复原IP地址(leetcode)

题目链接:
https://leetcode-cn.com/problems/restore-ip-addresses/
难度:中等
93. 复原IP地址
	给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
	有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。
示例:
	输入: "25525511135"
	输出: ["255.255.11.135", "255.255.111.35"]

题目不难 不过这并不妨碍我不会做 不得不承认 我对递归的理解太浅薄了 (说到底就是菜 )
确定递归的参数 字符串 当前是第几个数 从第几位开始

class Solution {
    
    
public:
    static constexpr int SEG_COUNT = 4;
    vector<string> ans;
    vector<int> segments;
    void dfs(const string&s,int segid,int segstart){
    
    
    	// 满足条件
    	//   segid=4 表示已经有四个数了
    	//   segstart=s.size() 表示正好到达s结尾
    	// segments取出(“.” 勿忘)   存入ans
        if(segid==SEG_COUNT){
    
    
            if(segstart==s.size()){
    
    
                string ip="";
                for(int i=0;i<SEG_COUNT;i++){
    
    
                    ip+=to_string(segments.at(i));
                    if(i!=SEG_COUNT-1){
    
    
                        ip += ".";
                    }
                }
                ans.push_back(move(ip));
            }
            return;
        }
        // 还没有到四个数就已经到末尾了
        if(segstart==s.size()){
    
    
            return;
        }
        // 若当前为0 则下一个
        if(s.at(segstart)=='0'){
    
    
            segments.at(segid)=0;
            dfs(s,segid+1,segstart+1);
        }
        // addr当前数值
        int addr = 0;
        for(int i=segstart;i<s.size();++i){
    
    
            addr=addr*10+(s.at(i)-'0');
            if(addr>0&&addr<=0xFF){
    
    
                segments[segid] = addr;
                dfs(s,segid+1,i+1);
            }else{
    
    
            	// 若不在<=255 再加上一位更大 
            	// 直接跳出循环 此种情况的可能选择已经结束
                break;
            }
        }
    }

    vector<string> restoreIpAddresses(string s) {
    
    
    	// 将过程中的数存入segments
        segments.resize(SEG_COUNT);
        dfs(s,0,0);
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/li_qw_er/article/details/107888814