【问题标题】:Hash function to see if one string is scrambled form/permutation of another?散列函数来查看一个字符串是否是另一个字符串的加扰形式/排列?
【发布时间】:2021-06-18 13:44:58
【问题描述】:

我想检查字符串 A 是否只是字符串 B 的重新排序版本。例如,"abc" = "bca" = "cab"...

这里还有其他解决方案:https://www.geeksforgeeks.org/check-if-two-strings-are-permutation-of-each-other/

但是,我认为散列函数会是一种简单的方法,但典型的散列函数会考虑顺序。有没有不关心字符顺序的哈希函数?

【问题讨论】:

  • 不,这不是哈希函数的用途。
  • @SergioTulentsev 你是什么意思?
  • 我的意思是,为不同顺序的元素生成不同的哈希值正是哈希函数需要做的。如果顺序对您不重要,请在散列之前排序。
  • 我建议计数字符的想法。

标签: string algorithm


【解决方案1】:

有没有不关心字符顺序的哈希函数?

我不知道现实世界中具有此属性的哈希函数,不。因为这不是他们旨在解决的问题。

但是,在这种特定情况下,您可以创建自己的“哈希”函数(一个非常非常糟糕的函数),它确实会忽略顺序:只需对字符的 ASCII 代码求和。这是由于加法的交换性质(a + b == b + a

def isAnagram(self,a,b):
    sum_a = 0
    sum_b = 0
    for c in a:
        sum_a += ord(c)
    for c in b:
        sum_b += ord(c)
    return sum_a == sum_b

重申一下,这绝对是一个 hack,它只是碰巧起作用,因为输入字符串的内容有限 in the judge system(只有小写的 ASCII 字符并且不包含空格)。它不会(可靠地)在任意字符串上工作。

【讨论】:

    【解决方案2】:

    为了快速检查,您可以使用 kind af hash-funcction

    候选人是:

    • 异或字符串的所有字符
    • 添加字符串的所有字符
    • 将字符串的所有字符相乘(小心可能导致大字符串溢出)

    如果哈希值相等,它仍然可能是两个不“相等”字符串的冲突。因此,您仍然需要进行专门的比较。 (例如,在比较它们之前对每个字符串的字符进行排序)。

    【讨论】:

    • 所有这些仍然以线性时间运行,因此它们并不比计数字符快。不过,它们确实使用较少的内存。
    • @Sergio Tulentsev:你不能比线性更快,因为你至少需要阅读孔弦。但是计算 1 个值并比较它可能比创建一个 ouf 计数器数组更快,也比比较这个数组的所有条目要快。
    • 它甚至可能是这样(尽管很小)。除非您无论如何都必须运行完整检查。然后它的工作量是原来的两倍。
    • @SergioTulentsev " 那么工作量是原来的两倍。"仍然是 O(n)。 Is premature optimization really the root of all evil?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2013-02-20
    • 2019-05-11
    • 2012-11-23
    • 2019-03-23
    • 2019-04-17
    相关资源
    最近更新 更多