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

标签 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

这是通过使用以下逻辑完成的

  • 将第一个字符串视为公共(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/

相关文章:

java - 使用Java subString格式化以点分隔的字符串 (".")

java - 获取HashMap值的count个数

Java ActionListener 将变量返回到包含 ActionListener 的方法

java - 如何在正则表达式中添加参数?

javascript - 需要帮助理解正则表达式在 JavaScript 中的作用

c++ - 在 `std::search` 上使用 `string::find`

java - Java中 "char"和 "String"的区别

java - 从 hybris hMC 操作中以编程方式检索 Spring bean

java - 带有 JScrollPane 和原型(prototype)单元格值的 JList 包裹元素名称(用点替换而不是显示水平滚动条),为什么?

regex - 如何使用正则表达式匹配两个整数大于零的字符串?