题目要求:
编写一个函数来查找集合中存放字符串的最长公共前缀。
如果不存在公共前缀,返回字符串"不存在公共前缀!"
思路:
先判断集合中元素有没有空字符串(length==0),有就输出"不存在公共前缀!"。没有的话,那就取集合中长度最小的字符串,最长公共前缀不会超过这个字符串,再取集合中的元素和该字符串通过charAt()方法,依次比较各角标位置的字符是否相等,两层for循环,外面一层代表比较的角标,里面一层是从集合中取自符串;一旦里面一层循环的比较存在不相等,就跳出整个循环。
public class Prefix {
public void pk(ArrayList<String> str) {
int index = str.size() - 1, length = str.get(str.size() - 1).length();
StringBuffer strbf = new StringBuffer();
boolean flag = true;
for (int i = str.size() - 1; i > 0; i--) {
if (str.get(0).length() == 0 || str.get(i).length() == 0) {
flag = false;
System.out.println("不存在公共前缀!");
}
if (str.get(i - 1).length() <= str.get(i).length()) {
if (length > str.get(i - 1).length()) {
length = str.get(i - 1).length();
index = i - 1;
}
}
}
int count = str.size();
System.out.println(index + "," + length);
while (flag) {
for (int i = 0; i < length; i++) {
for (int j = 0; j < str.size(); j++) {
if (j != index) {
if (str.get(index).charAt(i) == str.get(j).charAt(i)) {
count--;
if (count == 1) {
//比较完所有元素后,满足条件的单个字符被加入StringBuffer类型的空strbf中
strbf = strbf.append(str.get(index).charAt(i));
//相等的前提下存在最长公共前缀就是最标记的字符串本身(长度最小的字符串),在这个位置输出strbf
if (strbf.length() == str.get(index).length()) {
System.out.println(strbf);
}
}
} else {//不相等的情况,存在前面有部分相等的情况还有就是没有公共前缀两种情况;
if ((strbf.length() != 0)) {
System.out.println(strbf);
} else {
System.out.println("不存在公共前缀!");
}
return;
}
} else {
continue;//取得元素可能就是被比较的元素本身,匹配到就跳过,直接下一个;
}
}
count = str.size();//遍历一次比较后,将计数值调回原值;
}
flag = !flag;
}
}
public static void main(String[] args) {
ArrayList<String> str = new ArrayList<>();
str.add("stuuuuuuuuuu");
str.add("stusfuu");
str.add("stuuu");
str.add("stuajsu");
str.add("suuuuu");
str.add("stuuuuu");
str.add("stu ");
str.add("stuuuuu");
str.add("stuuuuu");
str.add("stuuuuu");
str.add("stuuuuu");
str.add("stuuuuu");
str.add("stuuu");
str.add("stuuuu");
Prefix prefix = new Prefix();
prefix.pk(str);
}
}
运行结果: