回溯演算法 復原IP位址

2021-10-06 19:34:24 字數 2930 閱讀 3218

leetcode 93 復原ip位址

首先乙個正確有效的ip位址,由4個整數構成,介於0-255,也就是說每個整數長度介於1-3,那麼整個ip的有效長度(不包含』.』)就介於4-12,這就是對於給出的字串長度不再這個範圍之內,就不用回溯了。

第二點,字串中有0的情況,比如』010010』,在回溯的時候,就可能出現』001』這樣的選擇,顯然這種情況是不正確的,不能以0開頭,除非就只有乙個0,這裡就是剪枝操作了,也就是一旦出現這樣的選擇,後面就不用再進行回溯。

第三,遞迴終止條件:形成4個整數,並且這4個整數長度加起來為原數字字串的長度。

def

restoreipaddresses

(self, s:

str)

-> list[

str]

: n =

len(s)

if n <

4or n >12:

return

res =

defbacktrace

(start, tmp, s)

:#遞迴終止條件

iflen

(tmp)==4

andlen(''

.join(tmp)

)== n:

'.'.join(tmp)

)return

for i in

range

(start, n)

:#如果加上當前選擇大於255,那麼直接從當前選擇重新開始,構造下乙個整數

ifint

(s + s[i]

)>

255:

s = s[i]

else

: s += s[i]

#處理以0開頭的情況,比較整型化前後是否相同,

#比如'001',int('001')就是1,如果不一樣

#那就是無效的了,無需進行後面的回溯過程

if s[0]

=='0'

:if s !=

str(

int(s)):

continue

#標準回溯過程

_s, s = s,

'' backtrace(i+

1, tmp, s)

tmp.pop(

) s = _s

backtrace(0,

,'')return res

整個過程除了剪枝的操作,其他的就是模板的東西,沒啥特別的,很有套路是不是。。。做選擇的過程有點像求子集,每次回溯起點從i+1開始

再來看一道題,**真的是基本一樣。。

leetcode 309 累加數

同樣要對以0開頭的情況進行剪枝,操作和上一道題完全一樣。

這道題另外需要注意的是,由前兩個數可以確定第三個數,如果當前的整個數,並不等於其前兩個數之後,那麼說明,這種組合是錯誤的,那麼後面的就沒有必要再進行回溯了,這是第二個需要剪枝的。

class

solution

:def

isadditivenumber

(self, num:

str)

->

bool

: n =

len(num)

if n <3:

return

false

res =

defbacktrace

(start, tmp, s)

:#終止條件

iflen

(tmp)

>=

3and

len(

''.join(tmp)

)== n:

tmp =

[int

(each)

for each in tmp]

for i in

range(2

,len

(tmp)):

if tmp[i-1]

+ tmp[i-2]

!= tmp[i]

:return

false

return

true

for i in

range

(start, n)

: s += num[i]

#以0開頭的情況,一樣的

if s[0]

=='0'

:if s !=

str(

int(s)):

continue

#如果當前的數不等於前兩個數之和,後面就不用再回溯,直接往後移位

iflen

(tmp)

>

2and

int(tmp[-1

])!=int

(tmp[-3

])+int

(tmp[-2

]):continue

#回溯 _s, s = s,

''if backtrace(i+

1, tmp, s)

:return

true

s = _s

tmp.pop(

)return

false

if backtrace(0,

,''):

return

true

return

false

**是不是基本一樣,如出一轍。以不變應萬變(狗頭)

復原IP位址

給定乙個只包含數字的字串,復原它並返回所有可能的 ip 位址格式。示例 輸入 25525511135 輸出 255.255.11.135 255.255.111.35 class solution public void help string sub string cur,listres int ...

復原IP位址

問題描述 給定乙個只包含數字的字串,復原它 在中間插入點號 並返回所有可能的 ip 位址格式,輸出可能的格式的數量。有效的 ip 位址正好由四個整數 每個整數字於 0 到 255 之間 組成,整數之間用 分隔。輸入說明 輸入乙個只包含數字的字串 輸出說明 輸出乙個整數 輸入範例 2552551113...

復原IP位址

題目描述 給定乙個只包含數字的字串,復原它並返回所有可能的 ip 位址格式。有效的 ip 位址正好由四個整數 每個整數字於 0 到 255 之間組成 整數之間用 分隔。示例 輸入 25525511135 輸出 255.255.11.135 255.255.111.35 遞迴方法 需要找出所有可能復原...