1. 程式人生 > 程式設計 >python 輸入字串生成所有有效的IP地址(LeetCode 93號題)

python 輸入字串生成所有有效的IP地址(LeetCode 93號題)

這題的官方難度是Medium,點贊1296,反對505,通過率35.4%。從各項指標來說看起來有些中規中矩,實際上也的確如此。這道題的解法和立意都有些顯得新意不足,但總體來說題目的質量還是可以的,值得一做。

題意

給定一個由數字組成的字串,我們希望通過這個字串得到所有有效ip地址的組合。對於一個有效的ip地址而言,它應該有4個數字組成,每一個數字的範圍在0到255之間。

一個字串可能可以轉化成多個ip地址,我們需要儲存下來所有可以成立的情況。

樣例

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

題解

這道題的題意蠻新穎的,將字串和ip地址結合在了一起,但是題目的核心說實話有些老生常談了,都是那種將一個大局面轉化成若干個小局面之和的情況。

我們之前做的全排列問題、八皇后問題等等都是這種,拿八皇后問題舉例,看起來是我們要在棋盤上放置皇后。但實際上我們最終想要的結果是放置好了八個皇后之後的局面,這個局面是由放置了每一個皇后之後的小局面組合在一起構成的。所以本質上也可以看成是小局面組裝成大局面的問題。

說了這麼多,其實只為了說明一點,就是遇到這些大局面拆分小局面的問題,我們可以率先考慮搜尋演算法。搜尋演算法除了可以理解成在一個搜尋空間或者是一棵搜尋樹當中尋找到解之外,也可以理解成可以用來尋找一些小局面的組合,讓它們組合起來可以構成我們想要的大局面。

套用到這道題上來,很顯然最後我們想要的大局面是合法的IP地址,而構成這個大局面的小局面則是構成IP地址的每一個數字。

這些都搞明白了之後,程式碼就很好寫了:

class Solution:
  def restoreIpAddresses(self,s: str) -> List[str]:
    n = len(s)
    if n < 4 or n > 12:
      return []
    
    ret = []
    
    def dfs(cur,ips):
      # 如果遞迴結束,並且ips當中剛好存了4個ip
      # 則生成答案
      if cur >= n:
        if len(ips) == 4:
          ret.append('.'.join(ips[:]))
        return
      
      # 遍歷下一個ip是幾位
      for i in range(cur,min(cur+3,n)):
        # 如果超過1位但是第一位是0,那麼非法
        if s[cur] == '0' and i > cur:
          return
        # ip必須小於等於255
        num = int(s[cur: i+1])
        if num > 255:
          return
        
        # 回溯
        ips.append(s[cur: i+1])
        dfs(i+1,ips)
        ips.pop()
        
    dfs(0,[])
    return ret

總結

有些新意但是思路中規中矩的搜尋問題,熟悉dfs和回溯的話不會很難。

今天的文章到這裡就結束了,如果喜歡本文的話,請來一波素質三連,給我一點支援吧(關注、轉發、點贊)。

以上就是python 輸入字串生成所有有效的IP地址(LeetCode 93號題)的詳細內容,更多關於python 生成IP地址的資料請關注我們其它相關文章!