1. 程式人生 > >[LeetCode] Restore IP Addresses 復原IP地址

[LeetCode] Restore IP Addresses 復原IP地址

大網 有一點 style example span rest bstr com [0

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

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

這道題要求是復原IP地址,IP地址對我們並不陌生,就算我們不是學CS的,只要我們是廣大網友之一,就應該對其並不陌生。IP地址由32位二進制數組成,為便於使用,常以XXX.XXX.XXX.XXX形式表現,每組XXX代表小於或等於255的10進制數。所以說IP地址總共有四段,每一段可能有一位,兩位或者三位,範圍是[0, 255],題目明確指出輸入字符串只含有數字,所以當某段是三位時,我們要判斷其是否越界(>255),還有一點很重要的是,當只有一位時,0可以成某一段,如果有兩位或三位時,像 00, 01, 001, 011, 000等都是不合法的,所以我們還是需要有一個判定函數來判斷某個字符串是否合法。這道題其實也可以看做是字符串的分段問題,在輸入字符串中加入三個點,將字符串分為四段,每一段必須合法,求所有可能的情況。根據目前刷了這麽多題,得出了兩個經驗,一是只要遇到字符串的子序列或配準問題首先考慮動態規劃DP,二是只要遇到需要求出所有可能情況首先考慮用遞歸

。這道題並非是求字符串的子序列或配準問題,更符合第二種情況,所以我們要用遞歸來解。我們用k來表示當前還需要分的段數,如果k = 0,則表示三個點已經加入完成,四段已經形成,若這時字符串剛好為空,則將當前分好的結果保存。若k != 0, 則對於每一段,我們分別用一位,兩位,三位來嘗試,分別判斷其合不合法,如果合法,則調用遞歸繼續分剩下的字符串,最終和求出所有合法組合,代碼如下:

 1 class Solution {
 2 public:
 3     vector<string> restoreIpAddresses(string s) {
 4         vector<string
> res; 5 if(s.length()==0) return res; 6 sol(s,4,"",res); 7 return res; 8 9 } 10 void sol(string s, int depth, string out,vector<string> &res){ 11 if(depth==0){ 12 if(s.empty()){ 13 res.push_back(out); 14 return
; 15 } 16 } 17 for(int i=1;i<=3;i++){ 18 if(s.size()>=i&&isValid(s.substr(0,i))){ 19 if(depth==1) sol(s.substr(i),depth-1,out+s.substr(0,i),res); 20 else sol(s.substr(i),depth-1,out+s.substr(0,i)+.,res); 21 } 22 } 23 } 24 bool isValid(string s){ 25 if(s.empty()||s.length()>3||(s.length()>1&&s[0]==0)) return false; 26 int tmp=atoi(s.c_str()); 27 return tmp<=255&&tmp>=0; 28 } 29 };

[LeetCode] Restore IP Addresses 復原IP地址