美文网首页
LeetCode --- 14.最长公共前缀

LeetCode --- 14.最长公共前缀

作者: KM_0d16 | 来源:发表于2020-01-09 18:52 被阅读0次

LeetCode --- 字符串、数组
简书专栏:https://www.jianshu.com/nb/41796568
知乎专栏:https://zhuanlan.zhihu.com/c_174823416

一、题目描述

来源:力扣(LeetCode)
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。

输入: ["flower","flow","flight"]
输出: "fl"
输入: ["dog","racecar","car"]
输出: ""
说明:
所有输入只包含小写字母 a-z 。

要求实现函数:
public String longestCommonPrefix(String[] strs) {}

二、实现思路以及代码

2.1 思路一:暴力破解法

先找出字符串数组中最短的字符串,记录其长度为min,以第一个字符串为基准,遍历长度为min,依次和字符串数组中的其他字符串相比较,如果都一样,则遍历下一位,一直到出现不同的字符为止,结束循环。

2.1.1 暴力破解实现代码

public static String longestCommonPrefix1(String[] strs) {
        if (strs.length == 0) {
            return "";
        }
        StringBuffer br = new StringBuffer();

        //最短数组长度
        int min = strs[0].length();
        for(int i = 1; i < strs.length; i++) {
            if (min > strs[i].length()) {
                min = strs[i].length();
            }
        }

        //匹配最短前缀
        for(int j = 0; j< min; j++) {
            char c = strs[0].charAt(j);
            for(int k = 1; k < strs.length; k++) {
                if(c != strs[k].charAt(j)){
                    return br.toString();
                }
            }
            br.append(c);
        }
        return br.toString();
    }

2.2 思路二:字符串巧解 水平扫描法

利用String类自带的函数indexOf()来进行数据处理,indexOf()函数返回的是目标字符串在当前字符串中所在的位置,如果当前字符串不存在目标字符串则返回-1。本算法实现思路是依次扫描字符串数组,以第一个字符串prefix为基准,如果后续字符串中prefix的位置不是在其初始位置,那么就对prefix进行从后向前缩减一个字符。可以理解为,prefix字符串和当前字符串取其从首字母开始的最长公共前缀,然后再求与下一个字符串的公共前缀,直到字符串数组遍历完成。其中,若prefix减为”“了,则表明没有共同前缀,直接返回。
该算法时间复杂度大大减少

2.2.1 水平扫描法实现代码

   public static String longestCommonPrefix2(String[] strs) {
        if (strs.length == 0) return "";
        String prefix = strs[0];
        for (int i = 1; i < strs.length; i++) {
            while (strs[i].indexOf(prefix) != 0) {
                prefix = prefix.substring(0, prefix.length() - 1);
                if (prefix.isEmpty()) return "";
            }
        }
        return prefix;
    }

三、测试代码

public static void main(String[] args) {
        String[] strs1 = {"hexlo", "helff", "hellx"};
        String[] strs2 = {"hello", "ssss", "wfef"};
        System.out.println(longestCommonPrefix1(strs1));
        System.out.println(longestCommonPrefix1(strs2));
        System.out.println(longestCommonPrefix2(strs1));
        System.out.println(longestCommonPrefix2(strs2));
    }

输出结果为:

he

he

相关文章

  • 14. 最长公共前缀

    14. 最长公共前缀[https://leetcode-cn.com/problems/longest-commo...

  • LeetCode学习计划:LeetCode 75-Level-2

    14. 最长公共前缀[https://leetcode.cn/problems/longest-common-pr...

  • 算法第3天:最长公共前缀

    leetcode 14. 最长公共前缀 simple 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共...

  • 2.算法-分治

    二分模板 经典例题 14. 最长公共前缀[https://leetcode-cn.com/problems/lon...

  • 14. 最长公共前缀

    20180923-摘抄自14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,...

  • [day4] [LeetCode] [title14,122]

    14.最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串""。 示例 ...

  • 14. 最长公共前缀

    14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 说明...

  • 14.最长公共前缀

    14.最长公共前缀 难度:简单 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ...

  • LeetCode 每日一题 [19] 最长公共前缀

    LeetCode 最长公共前缀 [简单] 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回...

  • 14. 最长公共前缀

    14.最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串""。 示例1...

网友评论

      本文标题:LeetCode --- 14.最长公共前缀

      本文链接:https://www.haomeiwen.com/subject/nwfuactx.html