我需要找到一种方法来查找字符串的公共前缀,例如:
可以将字符串附加2个或4个字符,如下所示:
hello12 hello1234
有时候,字符串也可能像这样结束:
hello11 hello1122
但是公共前缀现在是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 地狱
当输入以下内容时,它不会打招呼:
hello1122 你好1124 你好1124 hello1134
无论算法输入什么,我都希望输出是“ hello”。
答案 0 :(得分:0)
您的问题是只看各种字符是错误的方法。
您基本上说过:我希望我的前缀不包含数字。
换句话说:在收集最大前缀时,一旦遇到不符合条件的第一个字符(看起来是:该字符代表一个数字),就应该停止查看任何字符串。您可以依靠Character类及其isDigit()
方法。
但是这里的重点是:您需要澄清您的要求。如果您不能清楚地表达“前缀”的确切定义,那么编写Java代码是错误的优先级。换句话说:我们在这里谈论字母还是数字?空格呢?纯粹的“ ASCII”还是当心,任意的Unicode? p>
因此,真正的答案是:退后一步,从概念上确定您的想法什么构成有效前缀,什么恰好告诉您“前缀刚刚在这里结束”。
答案 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;
}
}