这是悦乐书的第146次更新,第148篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第5题(顺位题号是14),给定一个随机的字符串数组,查找这些字符串元素的公共前缀字符串,如果没有则返回空串。其中,字符串数组中的元素都是由小写字母a-z之间随机组合而成。例如:

输入:["flower","flow","flight"]

输出:"fl"

输入: ["dog","racecar","car"]

输出: ""

输入:["c"]

输出:"c"

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

第一步:获取数组的第一个元素first。

第二步:截取first字符串的0-1位,判断数组从第二个元素到最后一个元素是否都能匹配到截取的字符串,匹配到count就加1,如果count最后的值和数组除掉第一个元素后的长度相等,则是共有前缀。

第三步:如果第二步成功匹配上,则截取first字符串的0-2位,重复第二步的判断逻辑。

public static String longestCommonPrefix(String[] strs) {
String result = "";
if (strs.length == 0) {
return "";
}
if (strs.length == 1) {
return strs[0];
}
String first = strs[0];
for (int i=1; i<=first.length(); i++) {
String prefix = first.substring(0, i);
int count = 0;
for (int j=1; j<strs.length; j++) {
if (strs[j].indexOf(prefix) == 0) {
count = count + 1 ;
}
}
if (count != 0 && count == strs.length-1) {
result = prefix;
}
}
return result;
}

03 第二种解法

第一步:获取数组中第一个元素first。

第二步:用first和数组第二个元素匹配查找,找不到就循环将first元素从0到倒数第二位截取,直到first变为空,如果first为空则表示没有相同的前缀。

第三步:用first和数组第二个元素的共有前缀与数组第三个元素进行匹配查找,依次往后循环。

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

04 第三种解法

先将原数组分为两部分,左边部分依次获取共有前缀,右边部分依次获取共有前缀,再将左右两边的前缀进行查找,最后得到所有元素共有的前缀。此方法有点绕,可以通过调试或做标记及的方式理解。

public String longestCommonPrefix3(String[] strs) {
if (strs.length == 0) {
return "";
}
return partOf(strs, 0, strs.length-1);
} public String partOf(String[] strs, int leftIndex, int rightIndex) {
if (leftIndex == rightIndex) {
return strs[leftIndex];
} else {
int midIndex = (leftIndex + rightIndex)/2;
String leftStr = partOf(strs, leftIndex, midIndex);
String rightStr = partOf(strs, midIndex+1, rightIndex);
return getResult(leftStr, rightStr);
}
} public String getResult (String leftStr, String rightStr) {
int min = Math.min(leftStr.length(), rightStr.length());
for (int i=0; i<min; i++) {
if (leftStr.charAt(i) != rightStr.charAt(i)) {
return leftStr.substring(0, i);
}
}
return leftStr.substring(0, min);
}

05 小结

今天这题要解出来不难,难的是这是否是当前的唯一解?是否还可以另寻他法?

如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

本文首发于我的个人公众号:悦乐书,转载请注明出处!

【算法】LeetCode算法题-Longest Common Prefix的更多相关文章

  1. 乘风破浪:LeetCode真题_014_Longest Common Prefix

    乘风破浪:LeetCode真题_014_Longest Common Prefix 一.前言 如何输出最长的共同前缀呢,在给定的字符串中,我们可以通过笨办法去遍历,直到其中某一个字符不相等了,这样就得 ...

  2. Leetcode算法刷题:第14题 Longest Common Prefix

    Longest Common Prefix 题目 给予一个列表,元素为字符串,写一个程序找出最长公共前缀 解题思路 先比较两个字符串,如果第一个字符不一样,则返回空值,比较完成后,用这个公共字符串和下 ...

  3. leetcode第14题--Longest Common Prefix

    Problems:Write a function to find the longest common prefix string amongst an array of strings. 就是返回 ...

  4. LeetCode题解(14)--Longest Common Prefix

    https://leetcode.com/problems/longest-common-prefix/ 原题: Write a function to find the longest common ...

  5. Leetcode No.14 Longest Common Prefix最长公共前缀(c++实现)

    1. 题目 1.1 英文题目 Write a function to find the longest common prefix string amongst an array of strings ...

  6. [LeetCode][Python]14: Longest Common Prefix

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...

  7. 【一天一道LeetCode】#14 Longest Common Prefix

    一天一道LeetCode系列 (一)题目: Write a function to find the longest common prefix string amongst an array of ...

  8. # Leetcode 14:Longest Common Prefix 最长公共前缀

    公众号:爱写bug Write a function to find the longest common prefix string amongst an array of strings. If ...

  9. 【LeetCode】14. Longest Common Prefix 最长公共前缀

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:prefix, 公共前缀,题解,leetcode, 力扣 ...

  10. 【LeetCode】14. Longest Common Prefix 最长前缀子串

    题目: Write a function to find the longest common prefix string amongst an array of strings. 思路:求最长前缀子 ...

随机推荐

  1. JavaScript 系列博客(二)

    JavaScript 系列博客(二) 前言 本篇博客介绍 js 中的运算符.条件语句.循环语句以及数组. 运算符 算术运算符 // + | - | * | / | % | ++ | -- consol ...

  2. WPF 故事版例子

    Storyboard std = new Storyboard(); DoubleAnimation a = new DoubleAnimation(); a.From =0; a.To =400; ...

  3. WebBrowser引用IE版本问题,更改使用高版本IE

    做了一个Winform的项目.项目里使用了WebBrowser控件.以前一直都以为WebBrowser是直接调用的系统自带的IE,IE是呈现出什么样的页面WebBrowser就呈现出什么样的页面.其实 ...

  4. C#中设置窗口在最前显示而其他窗口不能使用

    对程序中的一个Form1处理,让其在打开的情况下,其他窗体都无法使用,全部焦点都在他身上. 1.这种方法最简单,直接调用窗体的模态对话框函数显示窗体 Form1.ShowDialog(): 2.设置窗 ...

  5. [PHP] 算法-字符串的左循环的PHP实现

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abcXYZde ...

  6. 详解MySQL基准测试和sysbench工具(转)

    前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...

  7. Log4j的扩展RollingFileAppender、DailyRollingFileAppender

    最常用的Appender--RollingFileAppender RollingFileAppender的一个Log4j配置样例: log4j.appender.R=org.apache.log4j ...

  8. element-ui 时间日期选择器格式化后台需要的格式

    <el-date-picker v-model="startTime" type="datetime" format="yyyy-MM-dd H ...

  9. K8s helm 创建自定义Chart

    # 删除之前创建的 chart helm list helm delete --purge redis1 # 创建自定义 chart myapp cd ~/helm helm create myapp ...

  10. 使用Vue-Router 2实现路由功能

    转自:http://blog.csdn.net/sinat_17775997/article/details/54710420 注意:vue-router 2只适用于Vue2.x版本,下面我们是基于v ...