回溯(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 上述搬運自 鏈表面試題 一 反轉鍊錶的演算法實現 以上就是每乙個節點都需要做的事情了,不管是迭代的方法還是遞迴的方法都是這樣的步驟。然而需要考慮的還不止這麼多,比如第乙個節點的上乙個節點的處理,以及方法結束時的返回...