📜  查找以给定后缀结尾的字符串(1)

📅  最后修改于: 2023-12-03 15:40:23.015000             🧑  作者: Mango

查找以给定后缀结尾的字符串

当我们需要在一个字符串集合中查找以给定后缀结尾的字符串时,常用两种方法:暴力搜索法和构建字典树法。下面我们将分别介绍这两种方法的思路和代码实现。

1. 暴力搜索法

暴力搜索法即对每个字符串进行遍历,检查其是否以给定后缀结尾。该方法时间复杂度为O(n*m),其中n为字符串集合中字符串的个数,m为每个字符串的平均长度。

def find_suffix(strings, suffix):
    result = []
    for s in strings:
        if s.endswith(suffix):
            result.append(s)
    return result
2. 构建字典树法

构建字典树是一种高效的字符串匹配方法,其时间复杂度为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']

总结

以上就是查找以给定后缀结尾的字符串的两种方法:暴力搜索法和构建字典树法。当字符串集合比较小、后缀长度较长时,推荐使用暴力搜索法;反之,推荐使用构建字典树法。