查找具有给定哈希值的按字典顺序最小的字符串[竞争编码]

时间:2019-06-01 18:33:03

标签: string hash dynamic-programming

我遇到了以下问题,但我找不到合适的解决方案。

  
    

该问题表明,对于具有特定哈希值的给定字符串,请找到最低的字符串(与给定的字符串不同)。     相同的长度和相同的哈希值(如果存在)。

为了     以下字母的值映射:
{a:0,b:1,c:2,...,z:25}
    如果给定的字符串是:具有哈希值的ady-27。     词典上最小的(从所有可能的除外)     给定一个)将是:acz

  

我可以想到的解决方案:
我将问题简化为零钱问题,并求助于给定总和找到所有可能的组合。在所有获得的解决方案中,我将它们排序并找到最低的解决方案(如果给定的字符串最小,则寻找下一个最小的解决方案)。
但是,问题在于找到所有可能的解决方案(即使采用DP方法),这对于较大的输入而言可能效率不高。

我的疑问
哪种解决方案策略(甚至可能是Greedy)可以提供比上述更好的时间复杂性?

1 个答案:

答案 0 :(得分:0)

我不能保证这会降低您的复杂度,但是有两件事:1您不需要检查所有空间,只需检查词典值小于或等于给定字符串的空间。 2:您可以将其表达为整数编程问题:

假设您的字符空间是字母,并且每个字母都有其数字索引[0-25],因此a对应于0,b对应于1,依此类推。令x_i为您的字符串中与索引i对应的字母数。您可以将问题表达为:

min sum_i(wi*xi)
st xi*ai = M
xi>=0,
sum_i(xi)=n
sum_i(wi*xi)<= N
xi integer

其中wi= 26^iai等于hash(letter(i)),n是原始字符串的字母数,N是原始字符串的哈希值。这是一个整数编程问题,因此您可以尝试将其插入求解器。原始问题与subset sum problem with fixed subset size非常相似(其中,哈希值是要求和的元素,子集大小是字符串的长度),所以您可能还想看看它,尽管您将从答案中看到这是一个复杂的问题。