>  기사  >  백엔드 개발  >  가장 긴 공통 하위 시퀀스 문제를 얻기 위해 역추적 방법 하위 집합 트리 템플릿을 사용하는 Python의 자세한 예

가장 긴 공통 하위 시퀀스 문제를 얻기 위해 역추적 방법 하위 집합 트리 템플릿을 사용하는 Python의 자세한 예

巴扎黑
巴扎黑원래의
2017-09-09 10:30:321533검색

이 기사에서는 역추적 방법 부분 집합 트리 템플릿을 사용하여 가장 긴 공통 부분 수열(LCS)을 구하는 Python의 방법을 주로 소개합니다. 가장 긴 공통 부분 수열 문제를 간략하게 설명하고 이를 예제와 결합하여 기반으로 가장 긴 공통 부분 수열을 구하는 Python의 방법을 분석합니다. 역추적 방법 부분 집합 트리 템플릿에 대해 긴 공통 부분 수열의 작업 단계 및 관련 주의 사항에 대해 도움이 필요한 친구들이 참조할 수 있습니다

이 기사에서는 가장 긴 공통 부분 수열을 얻기 위해 역추적 방법 부분 집합 트리 템플릿을 사용하는 Python의 예를 설명합니다( LCS). 참고를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

Question

Input

Line 1: String A
Line 2: String B
(A,B<= 1000의 길이 )

Output

가장 긴 하위 시퀀스를 출력합니다. 여러 개가 있으면 임의로 하나씩 출력합니다.

입력 예제

belong
cnblogs

출력 예제

blog

Analytic

요소를 사용해야 합니다. 상태공간 분석 방법.

문자열에서 길이가 짧은 문자를 요소로 사용하고, 길이가 긴 문자열의 문자를 상태 공간으로 사용합니다. 각 요소에 대해 상태 공간을 순회하고 다른 사항은 잘라내기 기능에 맡깁니다. ! !

해결 방법 x의 길이는 고정되어 있지 않으며 xi는 문자열 b의 시퀀스 번호를 나타냅니다.

각 요소를 처리할 때 상태가 선택되지 않으면(cnblogs의 문자가 선택되지 않음) 프로그램은 다음 요소로 이동할 수 없습니다.

이건 정말 큰 문제입니다! ! ! 하루 동안 고민한 끝에 마침내 방법을 알아냈습니다. 상태 공간을 확장하고 상태 q를 추가하는 것이었습니다! 요소가 상태 q를 선택하면 합법적입니다. 그러나 상태 q는 솔루션 x에 추가되지 않습니다! ! !

직관적인 그림 보기:

이제 즐겨보세요!

Code


&#39;&#39;&#39;最长公共子序列&#39;&#39;&#39;
# 作者:hhh5460
# 时间:2017年6月3日
a = &#39;belong&#39;
b = &#39;cnblogs&#39;
x = []  # 一个解(长度不固定)xi是b中字符的序号
X = []  # 一组解
best_x = [] # 最佳解
best_len = 0 # 最大子序列长度
# 冲突检测
def conflict(k):
  global n, x, X, a,b,best_len
  # 如果两个字符不相等
  if x[-1] < len(b) and a[k] != b[x[-1]]:
    return True
  # 如果两个字符相等,但是相对于前一个在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): # 到达a中的第k个元素
  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): # 遍历 状态空间:0~len(b)-1,技巧:人为增加一种状态len(b),表示改行没有元素选取
      if i==len(b): # 此状态不放入解x内
        LCS(k+1)
      else:
        x.append(i)
        if not conflict(k): # 剪枝
          LCS(k+1)
        x.pop()       # 回溯
# 根据一个解x,构造最长子序列lcs
def get_lcs(x):
  global b
  return &#39;&#39;.join([b[i] for i in x])
# 测试
LCS(0)
print(b)
print(best_x)
print(get_lcs(best_x))

Rendering

위 내용은 가장 긴 공통 하위 시퀀스 문제를 얻기 위해 역추적 방법 하위 집합 트리 템플릿을 사용하는 Python의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.