【问题标题】:Algorithm - check if any string in an array of strings is a prefix of any other string in the same array算法 - 检查字符串数组中的任何字符串是否是同一数组中任何其他字符串的前缀
【发布时间】:2013-07-02 23:16:48
【问题描述】:

我想检查字符串数组中的任何字符串是否是同一数组中任何其他字符串的前缀。我在考虑基数排序,然后单次通过数组。

谁有更好的主意?

【问题讨论】:

  • 如果你构建一个 trie (en.wikipedia.org/wiki/Trie),你只需要看看一个词是否有后缀。
  • 我喜欢 trie 的想法。问题的措辞方式是,如果您检测到后缀,您可能会在 trie 的填充过程中短路。 (问题并不是说你必须找到所有的前缀。)

标签: arrays string algorithm


【解决方案1】:

我认为,可以修改基数排序以即时检索前缀。我们所要做的就是按行的第一个字母对行进行排序,在每个单元格中存储没有第一个字母的副本。然后如果单元格包含空行,则此行对应一个前缀。如果单元格只包含一个条目,那么其中当然没有可能的行前缀。

这里,这可能比我的英语更干净:

lines = [
"qwerty",
"qwe",
"asddsa",
"zxcvb",
"zxcvbn",
"zxcvbnm"
]

line_lines = [(line, line) for line in lines]

def find_sub(line_lines):
    cells = [ [] for i in range(26)]
    for (ine, line) in line_lines:
        if ine == "":
            print line
        else:
            index = ord(ine[0]) - ord('a')
            cells[index] += [( ine[1:], line )]
    for cell in cells:
        if len(cell) > 1:
            find_sub( cell )

find_sub(line_lines)

【讨论】:

    【解决方案2】:

    如果对它们进行排序,则只需要检查每个字符串是否为下一个的前缀即可。

    【讨论】:

      【解决方案3】:

      要实现接近 O(N2) 的时间复杂度:计算每个字符串的哈希值。

      想出一个看起来像这样的好的哈希函数:

      • 来自 [a-z]->[1,26] 的映射
      • 模运算(使用大素数)防止整数溢出

      所以像“ab”这样的东西被计算为“12”=1*27+ 2=29

      注意事项

      注意计算散列值的基数。例如,如果基数小于 27,则可以有两个字符串给出相同的散列值,我们不希望这样。

      步骤:

      1. 计算每个字符串的哈希值
      2. 比较当前字符串与其他字符串的哈希值:我会让你弄清楚你将如何进行比较。一旦两个字符串匹配,你仍然不确定它是否真的是一个前缀(由于模运算我们做了)所以做一个额外的检查,看看它们是否是前缀。
      3. 报告答案

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 2015-09-08
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2012-04-30
        相关资源
        最近更新 更多