📅  最后修改于: 2023-12-03 15:40:23.015000             🧑  作者: Mango
当我们需要在一个字符串集合中查找以给定后缀结尾的字符串时,常用两种方法:暴力搜索法和构建字典树法。下面我们将分别介绍这两种方法的思路和代码实现。
暴力搜索法即对每个字符串进行遍历,检查其是否以给定后缀结尾。该方法时间复杂度为O(n*m),其中n为字符串集合中字符串的个数,m为每个字符串的平均长度。
def find_suffix(strings, suffix):
result = []
for s in strings:
if s.endswith(suffix):
result.append(s)
return result
构建字典树是一种高效的字符串匹配方法,其时间复杂度为O(m),其中m为待查找的字符串的长度。因此,构建字典树法的时间复杂度为O(n*m),其中n为字符串集合中字符串的个数。
class TrieNode:
def __init__(self):
self.children = {}
self.is_word_end = False
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for c in word:
if c not in node.children:
node.children[c] = TrieNode()
node = node.children[c]
node.is_word_end = True
def search_suffix(self, suffix):
result = []
node = self.root
for c in suffix:
if c not in node.children:
return result
node = node.children[c]
self.dfs(node, suffix[:-1], result)
return result
def dfs(self, node, prefix, result):
if node.is_word_end:
result.append(prefix)
for c, child in node.children.items():
self.dfs(child, prefix+c, result)
上面的代码中,首先定义了Trie和TrieNode类,分别表示字典树和字典树节点。在Trie类中,定义了三个方法:insert、search_suffix和dfs。其中,insert方法用于将字符串插入字典树中;search_suffix方法用于查找以给定后缀结尾的字符串;dfs方法用于遍历每个字符串节点,并将以该节点为结尾的字符串添加到结果列表中。
使用该方法查找以给定后缀结尾的字符串的代码如下:
strings = ['hello', 'world', 'he', 'hell', 'hi']
suffix = 'llo'
trie = Trie()
for s in strings:
trie.insert(s)
result = trie.search_suffix(suffix)
print(result)
输出结果为:['hello']
以上就是查找以给定后缀结尾的字符串的两种方法:暴力搜索法和构建字典树法。当字符串集合比较小、后缀长度较长时,推荐使用暴力搜索法;反之,推荐使用构建字典树法。