算法 - 检查字符串数组中的任何字符串是否是同一数组中任何其他字符串的前缀

时间:2013-07-02 23:16:49

标签: arrays string algorithm

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

任何人都有更好的主意吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 :(得分:1)

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

提出一个好的哈希函数,看起来像:

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

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

需要注意的一点

要小心你计算哈希值的基数。例如,如果你取一个小于27的基数,你可以让两个字符串给出相同的哈希值,我们不希望这样。

<强>步骤:

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