1. 程式人生 > >LeetCode算法系列:93.Restore IP Addresses

LeetCode算法系列:93.Restore IP Addresses

題目描述

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

Example:

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

演算法實現

這個問題首先要理解什麼是有效的IP地址:

  • 一個有效的IP地址被"."分為四段
  • 如果一個段包含3個字元,那麼這三個字元不能大於”255”,這是ip地址的基本知識;
  • 如果一個字元包括2個或3個字元,它的第一個字元不能為0。

採用回溯法,分別判斷從剩餘字元中拿出第一個字元,前兩個字元,前三個字元能不能組成一段,且剩餘的字元能不能組成剩餘的段數

//一個有效的IP地址被"."分為四段
//如果一個段包含3個字元,那麼這三個字元不能大於”255”,這是ip地址的基本知識;
//如果一個字元包括2個或3個字元,它的第一個字元不能為0。
class Solution {
public:
    vector<string> res;
    vector<string> oneres;
    
    vector<string> restoreIpAddresses(string s) {
        if(s.empty())return res;
        resIp(s,0,4);
        return res;        
    }
    //st為當前段開始的索引,c為剩餘字元應該分配的段數
    void resIp(string s, int st, int c){
        // cout << st << "," << c << endl;
        if(s.length() - st > 3*c || s.length() - st < 1*c)return;
        //如果剩餘字元分得一段,那麼需要判斷這一段能否滿足要求,若滿足要求則生成一種解決方案,否則退出進行回溯
        if(c == 1){            
            int suanz = 0;
            if(st == s.length() - 1 || s[st] != '0'){
                for(int i = s.length() - 1; i >= st; i --){
                    int d = pow(10,s.length() - 1 - i);
                    suanz += d * (s[i] - '0');
                }
                if(suanz <= 255){
                    string stringres;
                    for(auto c:oneres){
                        stringres += c;
                        stringres += '.';
                    }
                    stringres += s.substr(st);
                    res.push_back(stringres);
                }
            }
            return;
        }
        //如果剩餘字元可以分得的段數大於1段,分別判斷從剩餘字元中拿出第一個字元,前兩個字元,前三個字元能不能組成一段
        oneres.push_back(s.substr(st,1));
        resIp(s, st + 1, c - 1);
        oneres.pop_back();
        if(s[st] != '0' && st < s.length() - 2){
            oneres.push_back(s.substr(st,2));
            resIp(s, st + 2, c - 1);
            oneres.pop_back();
            if(st < s.length() - 3 && (s[st] - '0')*100 + (s[st + 1] - '0')*10 + s[st + 2] - '0' <= 255){
                oneres.push_back(s.substr(st,3));
                resIp(s, st + 3, c - 1);
                oneres.pop_back();
            }
        }
        
    }
};