LeetCode-Easy-014-Longest Common Prefix

描述

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string “”.

Example 1:
Input: ["flower","flow","flight"]
Output: "fl"
Example 2:
Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.
Note:

All given inputs are in lowercase letters a-z.

难度

Easy

题目链接:

https://leetcode.com/problems/longest-common-prefix/

思路

就是找字符串数组的公共前缀,开始还以为找公共字符串,还以为突然从 Easy 跳到 Medium 了。如果寻找公共前缀的话问题就简单得多:

    public static void main(String...args) {
        System.out.println(longestCommonPrefix2(new String[]{"flower","flow","flight"}));
        System.out.println(longestCommonPrefix2(new String[]{"racecdog","racecar","racccar"}));
        System.out.println(longestCommonPrefix2(new String[]{"docarg","racecar","car"}));
        System.out.println(longestCommonPrefix2(new String[]{"c","c"}));
        System.out.println(longestCommonPrefix2(new String[]{"c"}));
        System.out.println(longestCommonPrefix2(new String[]{"ca","c"}));
        System.out.println(longestCommonPrefix2(new String[]{"ac","c"}));
    }

    private static String longestCommonPrefix2(String[] strs) {
        if (strs.length == 0) return "";
        if (strs.length == 1) return strs[0];
        /* Find the shortest string. */
        String search = strs[0];
        for (int i=1; i<strs.length; i++) {
            if (strs[i].length() < search.length()) {
                search = strs[i];
            }
        }
        /* Find common prefix from start. */
        int i=0, len=search.length();
        for (; i<len; i++) {
            int k=0, size=strs.length;
            for (; k<size; k++) {
                if (strs[k].charAt(i) != search.charAt(i)) {
                    break;
                }
            }
            if (k != size) return search.substring(0, i); /* Meet different char. */
        }
        if (i == len) return search; /* Full length is the common. */
        return "";
    }

这里先找出最短的字符串,然后从索引 0 开始进行遍历,仅此而已!

另外,寻找最长公共字符串(不是前缀)的话,可以参考下面的代码:

    /**
     * 返回的是最长公共字符串
     *
     * @param strs
     * @return
     */
    private static String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) return "";
        if (strs.length == 1) return strs[0];
        String search = strs[0].length() < strs[1].length() ? strs[0] : strs[1];
        String another = strs[0].length() < strs[1].length() ? strs[1] : strs[0];
        for (int i=0, len=search.length(); i<len; i++) {
            for (int j=len; j>i; j--) {
                String com = search.substring(i, j);
                if (another.contains(com)) {
                    int k=2, size=strs.length;
                    for (; k<size; k++) {
                        if (!strs[k].contains(com)) {
                            break;
                        }
                    }
                    if (k == size) return com;
                }
            }
        }
        return "";
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值