演算法面試 LeetCode 0093復原IP位址

2022-08-24 12:15:11 字數 1809 閱讀 4643

回溯(dfs)

這是乙個回溯函式backtrack(prev_pos = -1, dots = 3) 的演算法,該函式使用上乙個放置的點 prev_pos 和待放置點的數量 dots 兩個引數 :

遍歷三個有效位置curr_pos 以放置點

檢查從上乙個點到現在點中間的部分是否有效 :

是 :放置該點。

檢查全部 3個點是否放好:

是 :將結果新增到輸出列表中。

否 :繼續放下乙個點 backtrack(curr_pos, dots - 1)。

回溯,移除最後乙個點

class restoreipaddress(object):

def __init__(self, s):

"""output為最終符合要求的列表

segments為儲存符合要求的擷取部分的列表

"""self._s = s

self.length = len(s)

self.output, self.segments = ,

def is_valid(self, segment):

"""1. 擷取的部分的整數必須小於或者等於255

2. 擷取部分除非是0否則不可以以0開頭

3. 返回bool

"""return int(segment) <= 255 if segment[0] != '0' else len(segment) == 1

def update_output(self, curr_pos):

""":param curr_pos:

:return:

"""# 最後乙個點放置完成後,針對剩餘擷取部分是curr_pos+1開始

segment = self._s[curr_pos + 1:self.length]

# 判斷最後剩餘部分是否符合

if self.is_valid(segment):

print(self.segments)

# 將最後部分刪除,然後移動curr_pos,這裡需要很好的理解遞迴

self.segments.pop()

# 最後一部分驗證不合格,則最為一種遞迴出口

def backtrack(self, pre_pos=-1, dots=3):

"""1. 有限制條件可知,'.'符號不可以放在頭部或尾部之後或者距離上乙個'.'三個字元以上,

所以range(pre_pos + 1, min(self.length - 1, pre_pos + 4))

"""for curr_pos in range(pre_pos + 1, min(self.length - 1, pre_pos + 4)):

segment = self._s[pre_pos + 1:curr_pos + 1]

if self.is_valid(segment):

# 這個點為最後乙個點則判斷是output否可以更新

if dots - 1 == 0:

self.update_output(curr_pos)

else:

# 遞迴,嘗試放入下乙個"."

self.backtrack(curr_pos, dots - 1)

# 1. 當update_output中最後一部分驗證失敗時,回溯時刪除擷取的部分

# 2. 在backtrack中驗證失敗,回溯時,刪除擷取的部分

self.segments.pop()

def result(self):

self.backtrack()

return self.output

LeetCode 009 回文數 C解法

category difficulty likes dislikes algorithms easy 55.96 593 companies判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121 輸出 true示例 2 輸入 121 輸出 fa...

面試高頻leetcode演算法題

持續更新 def quick rank nums if len nums 1 return nums left,right mid nums 0 for i in nums 1 if i mid else return quick rank left mid quick rank right 給定乙...

演算法題009 反轉單鏈表 by java

反轉單鏈表,可以使用迭代或者遞迴的方法 具象化反轉單鏈 反轉前 反轉中 反轉後 ps 上述搬運自 鏈表面試題 一 反轉鍊錶的演算法實現 以上就是每乙個節點都需要做的事情了,不管是迭代的方法還是遞迴的方法都是這樣的步驟。然而需要考慮的還不止這麼多,比如第乙個節點的上乙個節點的處理,以及方法結束時的返回...