查找字符串通用前缀的最佳方法是什么?

时间:2019-01-10 09:59:42

标签: java spring

我需要找到一种方法来查找字符串的公共前缀,例如:

可以将字符串附加2个或4个字符,如下所示:

hello12 hello1234

有时候,字符串也可能像这样结束:

hello11 hello11​​22

但是公共前缀现在是hello11​​,并且只能是hello。当只有一个字符串时,我还需要能够从字符串中获得问候。

我在下面编写了以下代码,当所有字符串都是唯一的并且没有任何公共附加值时,它可以工作。

字符串前缀=“”;

if(listStrings.size() > 0) {
  prefix = listStrings.get(0);

  for(int i = 1; i < listStrings.size(); i++) {
    String nextString = listStrings.get(i);
    int j;
    for(j = 0; j < Math.min(prefix.length(), listStrings.get(i).length()); j++) {
      if(prefix.charAt(j) != nextString.charAt(j)) {
        break;
      }
    }
    prefix = listStrings.get(i).substring(0, j);
  }
}

当以下输入为时,此代码会产生问候:

hello1234 你好5678 地狱

当输入以下内容时,它不会打招呼:

hello11​​22 你好1124 你好1124 hello11​​34

无论算法输入什么,我都希望输出是“ hello”。

2 个答案:

答案 0 :(得分:0)

您的问题是只看各种字符是错误的方法。

您基本上说过:我希望我的前缀不包含数字。

换句话说:在收集最大前缀时,一旦遇到不符合条件的第一个字符(看起来是:该字符代表一个数字),就应该停止查看任何字符串。您可以依靠Character类及其isDigit()方法。

但是这里的重点是:您需要澄清您的要求。如果您不能清楚地表达“前缀”的确切定义,那么编写Java代码是错误的优先级。换句话说:我们在这里谈论字母还是数字?空格呢?纯粹的“ ASCII”还是当心,任意的Unicode?

因此,真正的答案是:退后一步,从概念上确定您的想法什么构成有效前缀,什么恰好告诉您“前缀刚刚在这里结束”。

答案 1 :(得分:0)

如果您需要获取不带数字的前缀,则可以执行下一步:

for (j = 0; j < Math.min(prefix.length(), listStrings.get(i).length()); j++) {
                    int symCode = (int) prefix.charAt(j);
                    if (prefix.charAt(j) != nextString.charAt(j) ||
                            !((symCode > 64 && symCode < 91) || (symCode > 96 && symCode < 123))) {
                        break;
                    }
                }