截断字符串并消除重复的算法(不区分大小写)

时间:2015-03-28 14:35:31

标签: java regex string algorithm

我有一组满足以下约束条件的字符串

  • 区分大小写
  • 最大字符长度为10

我想转换这些字符串,以便跟随新约束有效(而不是先前的约束)

  • 不区分大小写
  • 最大字符长度为5

假设初始字符串集如下

city, City, cIty, ciTy, citY, CIty, cITy, ciTY, CITy, cITY, CITY

我有一个将这些字符串映射到以下

的部分算法
cit, cit1, cit2, cit3, cit4, cit5, cit6, cit7, cit8, cit9, cit10

这是通过使用以下逻辑

完成的
  • 将第一个字符串视为公共前缀
  • 计算其余字符串中的匹配数(不区分大小写匹配)。在目前的情况下,它是10
  • 确定后缀所需的字符数。在目前的情况下,因为我需要为1到10生成足够的内容,我需要为后缀保留2个字符
  • 将公共前缀截断为(最大字符数 - 后缀字符数)。在目前的情况下,它是(5-2),即3个字符
  • 通过连接截断的公共前缀和后缀
  • 来生成字符串

使用上面我能够将旧的字符串集映射到新集并满足新的约束。

但是,如果原始集合本身具有由算法

生成的任何字符串,则我的算法会中断

假设初始字符串集是

city, cit1, cit2, City, cIty, ciTy, citY, CIty, cITy, ciTY, CITy, cITY, CITY, 

在这种情况下,由于cit1和cit2已存在于初始集中,算法会中断(因为它会生成重复的cit1和cit2)

有什么办法可以递归处理吗?

1 个答案:

答案 0 :(得分:0)

我建议你这样做:

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"