我需要将一个输入字符串与多个字符串进行比较,我将这些字符串称为固定字符串,您可以假设后者在执行期间不会改变。比较忽略具有特殊字符的字母,仅从A到Z的字母,但不区分大小写。我需要尝试将输入字符串与每个固定字符串的开头匹配,即使不是所有字符都匹配,这与approximate string matching类似。
换句话说,您希望识别输入字符串中的每个单词和固定字符串中的每个单词之间的重叠。我对完全匹配特别感兴趣,例如下面第二个例子中的(love
)和(love
)
我实际上不想显示匹配项,而是基于它们进行一些计算:每当有完全匹配时,我想用某个值递增计数器,每当有部分匹配时,我想用另一个值递增计数器。计数是我真正想要的,但我需要先匹配字符串
如果我的固定字符串是“apple
”、“bullcrap
”、“tomato
”、“apricot
”,我应该能够搜索“Applecrab
”,并获得以下匹配项:
(Apple)crab App(l)ecrab Applecrab (Ap)plecrab
(apple) bul(l)crap tomato (ap)ricot
我还应该能够输入多个单词,如:
固定字符串:“i love books
”,“book fair
”;输入字符串:“I love
”;匹配项:
(I) I I | love (love) l(o)ve
(i) love books | I (love) b(o)oks
I I | l(o)ve love
book fair | b(o)ok fair
比较两个字符串的简单算法如下所示:
inputString = "love".lower()
fixedString = "love".lower()
lenComp = min(len(inputString), len(fixedString))
counter = 0
for i in range(lenComp):
if inputString[i] == fixedString[i]: # Partial match
counter += 1
if counter == len(inputString): # Full match
counter += 10
print(counter) # 14
因为固定字符串的数量不是很小,所以解决方案应该采用一种合适的数据结构。我在考虑树:一个prefix tree似乎是一个很好的匹配,但是它不会帮助字符串中间的松散匹配,例如^ {CD11}}和^ {CD12}},Aho–Corasick algorithm也不会。我认为Hamming distance也帮不上忙。我可以使用哪些数据结构/算法来实现这一点
我用Python标记它,因为我可能会使用它,但我现在不太关心实现
这只是一个探索的想法,也许一个修改过的前缀树可以完成这项工作,您需要添加每个字符串及其所有子字符串,并跟踪每个字符在树中其他位置的位置
例如:ABD、BAD、RCDB可以添加到前缀树中,如下所示
假设要查找CAB的匹配项,则需要一个获取字符串和起始位置的搜索函数
然后移除C并搜索位置为1的AB
这将找到A节点,该节点表示A存在于坏节点的位置1,您将遵循该链接。等等
编辑:
您可以通过从根节点开始并将字母表中的所有字母添加到该节点来创建树。每个字母都有一个位置字典
最初,所有字母的位置字典都是空的,也就是说,它们在任何单词中都不会用作起始字符或中间字符
加上ABD这个词,逻辑是这样的
接下来我们加上坏的
要搜索CAD这个词,您需要
编辑2:
这是一个非常简单(且效率低下)的python实现:
运行上述程序的输出为:
相关问题 更多 >
编程相关推荐