我正在寻找一种算法,该算法将采用字符串向量 v1
并返回类似的字符串向量 v2
,其中每个字符串都小于 x
字符长且唯一。 v1
中的字符串可能不是唯一的。
虽然我需要在 v1
中接受 ASCII,但我更愿意在插入新的时只插入字母数字字符 ([A-Za-z0-9]
)字符是必需的。
显然这里有三个警告:
对于
v1
和x
的某些值,不可能有唯一的v2
。例如,当v1
有 37 个元素且x == 1
时。问题中指定的“类似”是主观的。这些字符串将面向用户,并且可能是简短的自然语言短语(例如“颜色数”)。我希望人们能够尽可能轻松地将原始字符串映射到缩短的字符串。这可能意味着利用启发式方法,例如 disemvoweling .因为我的相似性构造可能没有客观的衡量标准(字符串距离在这里可能不是最有用的,尽管它可能)我对什么是好的判断将是任意的。该方法应适用于英语 - 其他语言无关。
显然这是一个(编程)语言不可知的问题,但我更看好 python 中的实现(因为我发现它的字符串处理语言很直接)。
最佳答案
关于在 python 中执行此操作的一些注意事项/提示。
- 使用bisect module保留您的结果数组,以便轻松发现潜在的非唯一性。即使
v1
已经排序(例如,name
和enemy
将在取消元音化后发生冲突) 也很有用
- 可以通过简单地在字符串上调用
.translate(None, "aeiouyAEIOUY")
来实现去除元音。 - 如果出现重复,您可以首先尝试通过将所有结果小写并使用交换大小写作为“位掩码”来解决冲突,即多次出现的 aaa 变为
["aaa", "aaA", "aAa", "aAA"]
等,如果从末尾开始“递增”字符不够,直到找到非冲突标识符,例如。["aa"]*7
会变成 ["aa", "aA", "Aa", "AA", "ab", "aB", "Ab"]
关于python - 我怎样才能唯一地缩短字符串列表,使它们最多 x 个字符长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971655/