国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python使用回溯法子集樹模板獲取最長公共子序列(LCS)的方法

2019-11-25 15:52:13
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Python使用回溯法子集樹模板獲取最長公共子序列(LCS)的方法。分享給大家供大家參考,具體如下:

問題

輸入

第1行:字符串A
第2行:字符串B
(A,B的長度 <= 1000)

輸出

輸出最長的子序列,如果有多個(gè),隨意輸出1個(gè)。

輸入示例

belong
cnblogs

輸出示例

blog

分析

既然打算套用回溯法子集樹模板,那就要祭出元素-狀態(tài)空間分析大法。

以長度較小的字符串中的字符作為元素,以長度較大的字符串中的字符作為狀態(tài)空間,對(duì)每一個(gè)元素,遍歷它的狀態(tài)空間,其它的事情交給剪枝函數(shù)!!!

解x的長度不固定,xi表示字符串b中的序號(hào)。

在處理每一個(gè)元素時(shí),如果沒有一個(gè)狀態(tài)被選擇(cnblogs中沒一個(gè)字符被選取),那么程序無法去往下一個(gè)元素。

這確實(shí)是個(gè)不小的麻煩!!!思考了一天,終于想出辦法了:擴(kuò)充狀態(tài)空間,增加一個(gè)狀態(tài)q!如果元素選取了狀態(tài)q,它是合法的。但是,狀態(tài)q不加入解x內(nèi)!!!

看一個(gè)直觀的圖:

至此,enjoy it!

代碼

'''最長公共子序列'''# 作者:hhh5460# 時(shí)間:2017年6月3日a = 'belong'b = 'cnblogs'x = []  # 一個(gè)解(長度不固定)xi是b中字符的序號(hào)X = []  # 一組解best_x = [] # 最佳解best_len = 0 # 最大子序列長度# 沖突檢測def conflict(k):  global n, x, X, a,b,best_len  # 如果兩個(gè)字符不相等  if x[-1] < len(b) and a[k] != b[x[-1]]:    return True  # 如果兩個(gè)字符相等,但是相對(duì)于前一個(gè)在b中的位置靠前  if a[k] == b[x[-1]] and (len(x) >= 2 and x[-1] <= x[-2]):    return True  # 如果部分解的長度加上后面a剩下的長度,小于等于best_len  if len(x) + (len(a)-k) < best_len:    return True  return False # 無沖突# 回溯法(遞歸版本)def LCS(k): # 到達(dá)a中的第k個(gè)元素  global x, X,a,b,best_len,best_x  #print(k, x)  if k == len(a): # 超出最尾的元素    if len(x) > best_len:      best_len = len(x)      best_x = x[:]  else:    for i in range(len(b)+1): # 遍歷 狀態(tài)空間:0~len(b)-1,技巧:人為增加一種狀態(tài)len(b),表示改行沒有元素選取      if i==len(b): # 此狀態(tài)不放入解x內(nèi)        LCS(k+1)      else:        x.append(i)        if not conflict(k): # 剪枝          LCS(k+1)        x.pop()       # 回溯# 根據(jù)一個(gè)解x,構(gòu)造最長子序列l(wèi)csdef get_lcs(x):  global b  return ''.join([b[i] for i in x])# 測試LCS(0)print(b)print(best_x)print(get_lcs(best_x))

效果圖

 

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 饶平县| 开江县| 太白县| 永安市| 德令哈市| 固安县| 虞城县| 任丘市| 鄢陵县| 图木舒克市| 彭山县| 安平县| 大宁县| 赤峰市| 固安县| 黄平县| 安岳县| 龙口市| 江都市| 旬阳县| 渝北区| 灵宝市| 丘北县| 和龙市| 元谋县| 麦盖提县| 乡城县| 磐石市| 施甸县| 龙江县| 蛟河市| 拜泉县| 德阳市| 株洲县| 衡东县| 汾西县| 华安县| 景泰县| 句容市| 长沙市| 中江县|