【LeetCode 中等題】48-復原IP地址
阿新 • • 發佈:2019-01-07
題目描述:給定一個只包含數字的字串,復原它並返回所有可能的 IP 地址格式。
示例:
輸入: "25525511135" 輸出:
["255.255.11.135", "255.255.111.35"]
解法1。暴力解法,用4個變數分別從[1,4)遍歷,再由此確定4個分段的下標
class Solution(object): def restoreIpAddresses(self, s): """ :type s: str :rtype: List[str] """ if not s or len(s) > 12: return [] res = [] for a in range(1,4): for b in range(1,4): for c in range(1,4): for d in range(1,4): if a+b+c+d == len(s): # 這一句一定要注意,必須要加,只有滿足此條件時才有效,大於會超index,小於無效 ip_s = '' A = int(s[:a]) B = int(s[a:a+b]) C = int(s[a+b:a+b+c]) D = int(s[a+b+c:a+b+c+d]) if A <= 255 and B <= 255 and C <= 255 and D <= 255: ip_s = str(A)+'.'+str(B)+'.'+str(C)+'.'+str(D) if len(ip_s) == len(s)+3 and ip_s not in res: res.append(ip_s) return res
解法2。用遞迴的解法。隱約覺得這個思路就是人思考的思路,從第一個子串開始,其變化範圍為[1,4),先判斷這個子串是否有效,然後遞迴下去看下一個子串,而這下一個子串的判斷思路和上一個一樣,也需要經過for迴圈,變化範圍為[1,4),再加上一些有效的判斷條件,用k值記錄字還剩下幾個字串要判斷,這個思路也可以改成[0,4]來判斷,
class Solution(object): def restoreIpAddresses(self, s): """ :type s: str :rtype: List[str] """ if not s or len(s) > 12 or len(s) < 4: return [] res = [] out = '' k = 4 self.restore(s, k, out, res) return res def restore(self, s, k, out, res): if k == 0: if not s: res.append(out) else: for i in range(1,4): if len(s) >= i and self.isValid(s[:i]): if k == 1: self.restore(s[i:], k-1, out + s[:i], res) else: self.restore(s[i:], k-1, out+s[:i]+'.', res) def isValid(self, s): if not s or len(s)>3 or (len(s)>1 and s[0]=='0'): return False res = int(s) return res <= 255 and res >= 0