LeetCode 93. 復原IP地址 | Python

93. 復原IP地址


題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/restore-ip-addressespython

題目


給定一個只包含數字的字符串,復原它並返回全部可能的 IP 地址格式。bash

有效的 IP 地址正好由四個整數(每一個整數位於 0 到 255 之間組成),整數之間用 '.' 分隔。app

示例:測試

輸入: "25525511135"
輸出: ["255.255.11.135", "255.255.111.35"]

解題思路


思路: 回溯spa

先看題目,題目要求的是給定一個只包含數字的字符串,復原返回全部可能的 IP 地址格式。至於 IP 地址的有效格式,是由 4 個整數(0~255),整數間用 '.' 分隔組成。.net

首先,根據題目,藉助示例來看下:rest

s = "25525511135"

假設,給定的字符串如上面示例,那麼咱們在第一個片斷中,咱們有三種選擇的可能:code

  • 選 '2';
  • 選 '25';
  • 選 '255'。

當第一片斷選擇完畢後,後續的三個片斷,也以一樣的形式去選擇。可是咱們在選擇的過程當中可能會出錯,若是出錯的話,此時咱們就須要撤銷這項選擇,轉而去嘗試另一個選擇。blog

一樣的,這裏咱們的選擇是有依據的,並不是隨意選擇。由題目,咱們也能夠發現,每一個片斷可選擇的數字區間在 [0, 255] 之間,這裏也表示長度不能超過 3。ip

這裏還有個須要注意的,題目中並無明確指出。每一個片斷中選擇的數字是不能有前導 0 的,0 能夠做爲一個選擇,可是不能出現 '0...' 這樣的形式,這個也是在測試用例沒過的時候發現的。╮(╯▽╰)╭

前面說了選擇以及限制,那咱們如何才能確認,當選擇完畢以後,選擇組成的片斷就是有效的?

  • 首先,要在前面所述的限制條件下進行選擇;
  • 再來,題目要求復原,也就是,咱們選擇完 4 個片斷以後,必須是要用完全部字符的。
  • 若是選擇完畢,可是沒有用完字符,表示此項選擇不符合,返回,回溯;若是先用完字符,可是沒有找齊 4 個片斷,一樣回溯。
  • 由於復原的結果可能不止一種,當找到有效的組合,存入返回列表中,繼續搜索直至全部可能的選擇都嘗試一次。

具體的代碼實現以下(含註釋)。

代碼實現


class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        res = []
        # 這裏初始化長度爲 4 的列表,分別存儲對應 4 個片斷
        sub_res = [0] * 4

        def dfs(seg_id, seg_first):
            # 先看找到 4 個片斷的狀況
            # 這裏可能出現字符徹底使用,以及未使用徹底的狀況
            if seg_id == 4:
                # 使用徹底則添加到列表後返回
                if seg_first == len(s):
                    res.append('.'.join(str(seg)for seg in sub_res))
                # 未徹底使用則直接返回
                return
            
            # 若未找到 4 個片斷,則繼續查找
            # 這裏要注意未找到 4 個片斷卻使用完字符的狀況
            if seg_first == len(s):
                return

            # 不能存在前導 0,若是有 0,那麼當前片斷只能爲單獨 0
            if s[seg_first] == "0":
                sub_res[seg_id] = 0
                dfs(seg_id+1, seg_first+1)

            addr = 0
            # 每一個片斷選擇的狀況
            for seg_last in range(seg_first, len(s)):
                # 這裏用整型來表示,後面再轉換爲字符串類型,避免過於頻繁的切片
                addr = addr * 10 + (ord(s[seg_last]) - ord('0'))

                # 大於 0,但小於等於 255 的狀況
                if 0 < addr <= 255:
                    sub_res[seg_id] = addr
                    dfs(seg_id+1, seg_last+1)
                # 其餘狀況直接跳出循環
                else:
                    break
            
        dfs(0, 0)
        return res

實現結果


實現結果

歡迎關注


公衆號 【書所集錄

相關文章
相關標籤/搜索