我有一组满足以下约束的字符串
- 区分大小写
- 最大字符长度为 10
我想转换这些字符串,以便遵循新的约束(而不是以前的约束)
- 不区分大小写
- 最大字符长度为 5
假设初始字符串集合如下
city, City, cIty, ciTy, citY, CIty, cITy, ciTY, CITy, cITY, CITY
我有一个部分算法将这些字符串映射到以下内容
cit, cit1, cit2, cit3, cit4, cit5, cit6, cit7, cit8, cit9, cit10
这是通过使用以下逻辑完成的
- 将第一个字符串视为公共(public)前缀
- 计算其余字符串中的匹配项数(不区分大小写的匹配项)。在当前情况下是 10
- 确定后缀所需的字符数。在当前情况下,因为我需要生成 1 到 10 的后缀,所以我需要为后缀保留 2 个字符
- 将公共(public)前缀截断为(最大字符数 - 后缀的字符数)。在当前情况下是 (5 - 2) 即 3 个字符
- 通过连接截断的公共(public)前缀和后缀生成字符串
使用上面的方法,我能够将旧的字符串集映射到新的字符串集并满足新的约束。
但是,如果原始集本身具有算法生成的任何字符串,我的算法就会中断
假设初始字符串集是
city, cit1, cit2, City, cIty, ciTy, citY, CIty, cITy, ciTY, CITy, cITY, CITY,
在这种情况下,由于 cit1 和 cit2 已经存在于初始集合中,算法中断(因为它生成了重复的 cit1 和 cit2)
有什么方法可以递归处理这个问题吗?
最佳答案
我建议你这样做:
for each input string, s
if (result.contains(s))
result.add(s)
else
do
s = next(s)
while (result.contains(s))
result.add(s);
其中 next(s)
将被定义为
split s into [prefixPart, numberPart]
num = numberPart == null ? 0 : numberPart+1
prefixLength = Math.min(prefixPart.length, 5 - num.length)
return prefixPart.substring(0, prefixLength) + num
即next("citY") = "citY0"
和 next("cit45") = "cit46"
关于java - 截断字符串并消除重复项的算法(不区分大小写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29318359/