查找最长公共前缀

题目要求:

编写一个函数来查找集合中存放字符串的最长公共前缀。

如果不存在公共前缀,返回字符串"不存在公共前缀!"

思路:

先判断集合中元素有没有空字符串(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);
    }
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值