编辑:对不起,我的示例代码有问题,您需要这种算法作为您将猜测的部分的第一步:最长的子字符串或这个
您将需要添加迭代和一些掩蔽,就像上面和 David 解释的那样,也在下面的示例中,没有猜到 DVD-RW 的“L121”(正如我所说的,我必须从“common”开始)。因此,您需要找到所有常见的连续子序列并确定哪些是相关的!(可能带有一种最大化增益函数)
使用第二个链接 long_substr :
>>> for x in d:
for y in d:
if x == y: continue
common = long_substr([x, y])
length = len(common)
if x.startswith(common) and y.startswith(common):
print "\t".join((x, y, str(length), common))
产生 =>
0324311071068 0324311071134 10 0324311071
0324311071134 0324311071068 10 0324311071
1613519L121 1613518L121 6 161351
1613519L121 1613509L121 5 16135
WMAYUJ844900 WMAYUJ753738 6 WMAYUJ
WMAYUJ844900 WMAYUJ072099 6 WMAYUJ
WMAYUJ844900 WMAYUJ683739 6 WMAYUJ
WMAYUJ753738 WMAYUJ844900 6 WMAYUJ
WMAYUJ753738 WMAYUJ072099 6 WMAYUJ
WMAYUJ753738 WMAYUJ683739 6 WMAYUJ
1613518L121 1613519L121 6 161351
1613518L121 1613509L121 5 16135
WMAYUJ072099 WMAYUJ844900 6 WMAYUJ
WMAYUJ072099 WMAYUJ753738 6 WMAYUJ
WMAYUJ072099 WMAYUJ683739 6 WMAYUJ
WMAYUJ683739 WMAYUJ844900 6 WMAYUJ
WMAYUJ683739 WMAYUJ753738 6 WMAYUJ
WMAYUJ683739 WMAYUJ072099 6 WMAYUJ
608131237 608131234 8 60813123
1613509L121 1613519L121 5 16135
1613509L121 1613518L121 5 16135
608131234 608131237 8 60813123
--- 第一个错误回复从这里开始
以下是我回复的第一部分,它只能帮助您了解我错在哪里,并且可能会给您一些想法:
一个使用最长公共子序列问题求解器LCS的示例,满足您的特殊需求,我可以认为这是猜测什么是常见的过程的第一步?
它在 Python 中,但对于演示部分,它可以很容易地阅读(或者可以在 IDLE(python 编辑器)中剪切和粘贴)假设您使用上面第一个链接的 ActiveState 代码食谱
这与生物信息学有关(想想基因对齐)
您将需要一些东西来确定最有趣的常见序列是什么(可能有最小的长度?然后像大卫已经提出或在我的评论中提出的那样进行掩蔽
(起初我没有看到 LCS 不是 LCS 连续求解器,而你需要它!所以我第一次使用 LCS 求解器是错误的 :( 因为它不连续,我有 MAYUJ8 或 WMAYUJ7 而不是WMAYUJ - 更短!虽然求解器找到最长的常见字符而不期望它们是连续的! - 再次抱歉)
>>> raw = """1613518L121
1613509L121
1613519L121
0324311071068
0324311071134
608131234
608131237
WMAYUJ753738
WMAYUJ072099
WMAYUJ683739
WMAYUJ844900"""
>>> d = dict()
>>> for line in raw.split("\n"):
if not line.strip(): continue
value = line.strip()
d[value] = 1
>>> for x in d:
for y in d:
if x == y: continue
length = LCSLength(x, y)
common = LCS(x,y)
if length >= 3 and x.startswith(common):
print "\t".join((x, y, str(length), common))
产生 =>
0324311071068 0324311071134 10 0324311071
0324311071068 608131234 4 0324
0324311071134 0324311071068 10 0324311071
WMAYUJ844900 WMAYUJ753738 7 WMAYUJ8
WMAYUJ753738 WMAYUJ072099 7 WMAYUJ7
608131237 608131234 8 60813123
608131234 608131237 8 60813123