有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查找字符串的公共前缀的最佳方法是什么?

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

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

你好 你好

但有时,字符串也可能以这样的方式结束:

你好 你好1122

但是现在通用的前缀是hello11,它应该只有hello。当只有一个字符串时,我还需要能够从字符串中获取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);
  }
}

当以下输入为时,此代码生成hello:

你好 你好5678 hellothere

当以下输入为:

你好1122 你好 你好 你好,1134

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


共 (2) 个答案

  1. # 1 楼答案

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

    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;
                        }
                    }
    
  2. # 2 楼答案

    你的问题是,仅仅看各种各样的角色是错误的方法

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

    换句话说:在收集max前缀时,一旦遇到与条件不匹配的第一个字符(似乎是:该字符代表一个数字),就应该停止查看任何字符串。您可以依赖Character类及其isDigit()方法来实现这一点

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

    因此,真正的答案是:退后一步,在概念上下定决心什么是有效的前缀,什么确切地告诉你“前缀刚刚结束”