【LeetCode·Longest Common Prefix 】

题目

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

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

示例 2:

输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。

提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成。

解题思路

思路1

从第一个元素开始,依次与下一个元素匹配相同的内容,并用StringBuilder sb承接。比较出每一个匹配中的最长相似字符,并更新sb。遍历后续元素,比较该元素与sb.toString()的最长相似字符。

 public String longestCommonPrefix(String[] strs) {
    if (strs.length == 0) {
        return "";
    }
    StringBuilder sb = new StringBuilder(); 
    for (int i = 1; i < strs.length; i++) {
        // 确定遍历长度 
        int len = Math.max(strs[i].length(), strs[i-1].length());
        
        for (int j = 0; j < len; j++) {
            if (j < strs[i-1].length() && j < strs[i].length()) {
                if (strs[i].charAt(j) == strs[i-1].charAt(j)) {
                    sb.append(strs[i].charAt(j)); 
                } else {
                    break;
                }
            }
        }
        
        // 如果有更长的相同序列,更新 sb
        String prefix = sb.toString();
    }
    return sb.toString();
}

但是太复杂了,并且涉及到BF和KMP算法,所以这个代码写不好。

思路2

先考虑strs[]中只有0个或一个元素的情况;
再利用indexOf()函数求出元素前缀。

 public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) return "";
        if (strs.length == 1) return strs[0];

        StringBuilder prefix = new StringBuilder(strs[0]);
        for (int i = 1; i < strs.length; i++) {
            while (strs[i].indexOf(prefix.toString()) != 0) {
/*indexOf() 是 Java 字符串类(String class)提供的方法之一,用于查
找子字符串在原始字符串中第一次出现的位置。如果找到了子字符串,该方法
返回子字符串在原始字符串中的起始索引;如果找不到,则返回 -1。*/
                prefix.setLength(prefix.length() - 1);
                if (prefix.length() == 0) return "";
            }
        }
        return prefix.toString();
    }

在这里插入图片描述

解题反思

为什么会出错呢?因为看题目不仔细,没有注意前缀,以为是求最长公共部分。 审题仔细! 审题仔细! 审题仔细! 审题仔细! 审题仔细! 审题仔细! 审题仔细! 审题仔细! 审题仔细!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值