算法:最长公共前缀

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

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

示例 1:

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

示例 2:

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

提示:

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

解法一:

  1. 首先,我们选择字符串数组中的第一个字符串作为初始的最长公共前缀,将其保存在一个变量中(ans)。
  2. 然后,我们从数组的第二个字符串开始逐个与当前的最长公共前缀进行比较。
  3. 在比较的过程中,我们从左到右逐个比较对应位置上的字符。如果所有字符串在当前位置上的字符都相等,那么该字符属于最长公共前缀的一部分,我们将其追加到最长公共前缀中。
  4. 如果在某个位置上,遇到了字符不相等的情况,或者有任何一个字符串到达了末尾,说明最长公共前缀的长度已经达到当前位置,不可能再有更长的公共前缀了,我们可以直接返回最长公共前缀。
  5. 重复步骤3和步骤4,直到遍历完所有字符串或返回最长公共前缀。

下面是代码示例:

public static String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }
    StringBuilder ans = new StringBuilder(strs[0]);
    for (String str: strs) {
        int index = 0;
        while (index < ans.length() && index < str.length() && ans.charAt(index) == str.charAt(index)) {
            index++;
        }
        ans.setLength(index);
    }
    return ans.toString();
}

解法二:

  1. 初始化一个空字符串ans以存储公共前缀。
  2. 对字符串数组按字典顺序进行排序。这一步是必要的,因为公共前缀应该对所有字符串都是公共的,所以我们需要在排序列表中找到第一个和最后一个字符串的公共前缀。
  3. 遍历排序列表中第一个和最后一个字符串的字符,在较短字符串的长度处停止。
  4. 如果第一个字符串的当前字符不等于最后一个字符串的当前字符,则返回到目前为止找到的公共前缀。
  5. 否则,将当前字符追加到ans字符串。
  6. 返回包含最长公共前缀的ans字符串。

下面是代码示例:

public static String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }
    StringBuilder ans = new StringBuilder();
    Arrays.sort(strs); // 按字典顺序进行排序
    String first = strs[0];
    String last = strs[strs.length-1];
    for (int i=0; i<Math.min(first.length(), last.length()); i++) {
        if (first.charAt(i) != last.charAt(i)) {
            return ans.toString();
        }
        ans.append(first.charAt(i));
    }
    return ans.toString();
}

        解法一比较中规中矩,解法二是先排序,后找出第一个和最后一个字符串的公共前缀,性能上解法二优于解法一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲤鱼程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值