Leetcode刷题-最长公共前缀

  • 简介
  • 题目
  • 个人答案及结果
  • 学习一下官方的

简介

最近尝试下大家口口相传的神器 leetcode-cn.com,大家自己注册就可以选择题库进行使用了。我都会先自己出一个答案,然后再学习别人的标准答案,进行自我提升。

题目

个人答案及结果

我直接把相关注释再代码体现出来

    public static void main(String[] args) {String[] strs = {"flower", "flow", "flight"};System.out.println("结果:" + longestCommonPrefix(strs));}public static String longestCommonPrefix(String[] strs) {//用来作为返回公缀使用//数组数量不固定,也没有next方法,只能与上一个进行比较String last = null;//防止数组空if (strs.length == 0) {return "";}//遍历数组for (String str : strs) {//字符串操作方便StringBuffer a = new StringBuffer();//数组第一个元素没有上一个,不进行比较,直接跳过,防止数组只有一个元素,所以直接给公缀赋值if (last == null) {last = str;} else {//字符串遍历操作char[] ca = last.toCharArray();char[] cb = str.toCharArray();//以短的为准,防止越界int length = ca.length < cb.length ? ca.length : cb.length;for (int i = 0; i < length; i++) {//因为需求是前缀,第一个都不同后面就免了if (i == 0 && ca[i] == cb[i]) {a.append(ca[i]);}//防止出现间隔相同这种情况,如: abc ,adc这种。else if (ca[i] == cb[i] && a.length() == i) {a.append(ca[i]);} else {break;}}//赋值last = a.toString();}}return last;}

学习一下官方的

了不得啊,官方给了三种方案 最长公共前缀-官方答案(视频)
简单介绍一下

  1. 水平扫描法,就是我上面写的

  2. 分治法
    先遍历前半部分,后遍历后半部分

    代码

/*** 分治法(先遍历前半部分,后遍历后半部分)*/public static String longestCommonPrefix2(String[] strs) {//防止数组空if (strs.length == 0) {return "";}//用来作为返回公缀使用//数组数量不固定,也没有next方法,只能与上一个进行比较//数组前半部分的结果String last = commonPrefix(strs, 0, strs.length / 2);if (last.equals("")) {return "";}//数组后半部分的结果String next = commonPrefix(strs, strs.length / 2, strs.length - 1);//两个结果比较return commonPrefix(new String[]{last, next}, 0, 1);}
public static String commonPrefix(String[] strs, int begin, int end) {String last = strs[begin];//遍历数组,与上一个进行比较,所以从第二个开始for (int a = begin + 1; a <= end; a++) {//字符串操作方便StringBuffer common = new StringBuffer();//字符串遍历操作char[] ca = last.toCharArray();char[] cb = strs[a].toCharArray();//以短的为准,防止越界int length = ca.length < cb.length ? ca.length : cb.length;for (int i = 0; i < length; i++) {//因为需求是前缀,第一个都不同后面就免了if (i == 0 && ca[i] == cb[i]) {common.append(ca[i]);}//防止出现间隔相同这种情况,如: abc ,adc这种。else if (ca[i] == cb[i] && common.length() == i) {common.append(ca[i]);} else {break;}}//赋值last = common.toString();}return last;}
  1. 二分法
    找到最短的字符串,分为两个字符串,分别与所有字段比较
    /*** 二分法官方(找到最短的字符串,分为两个字符串,分别与所有字段比较)*/public static String longestCommonPrefix4(String[] strs) {if (strs == null || strs.length == 0) {return "";}int minLength = Integer.MAX_VALUE;for (String str : strs) {minLength = Math.min(minLength, str.length());}int low = 0, high = minLength;while (low < high) {int mid = (high - low + 1) / 2 + low;if (isCommonPrefix(strs, mid)) {low = mid;} else {high = mid - 1;}}return strs[0].substring(0, low);}public static boolean isCommonPrefix(String[] strs, int length) {String str0 = strs[0].substring(0, length);int count = strs.length;for (int i = 1; i < count; i++) {String str = strs[i];for (int j = 0; j < length; j++) {if (str0.charAt(j) != str.charAt(j)) {return false;}}}return true;}

Leetcode刷题-最长公共前缀相关推荐

  1. 力扣刷题——最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:strs = ["flower","flo ...

  2. leetcode算法题--最长公共前缀

    原文链接:https://leetcode-cn.com/problems/longest-common-prefix/ 纵向扫描 string longestCommonPrefix(vector& ...

  3. LeetCode题组:第14题-最长公共前缀

    1.题目:最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",&quo ...

  4. 刻意练习:LeetCode实战 -- Task14. 最长公共前缀

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  5. LeetCode实战:最长公共前缀

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

  6. 算法题---最长公共前缀

    题目来源:https://leetcode-cn.com/problems/longest-common-prefix/ 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符 ...

  7. 【Leetcode | easy】最长公共前缀

    题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&q ...

  8. [Leedcode][JAVA][第14题][最长公共前缀][二分][横竖扫描][分治]

    [问题描述][中等] 编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "".示例 1:输入: ["flower","f ...

  9. 20190825:(leetcode习题)最长公共前缀

    最长公共前缀 题目 大致思路 代码实现 题目 大致思路 我们以第一个字符串为准,将后面的字符串与第一个进行比较即可. 比较时,将后续字符串依次与第一个字符串逐字符进行对比,相同的则append到Str ...

最新文章

  1. 替换 RHEL5的yum源为CentOS5源,亲测线上系统可用
  2. error code [17027]; 流已被关闭;
  3. 你可以不知道的JS二
  4. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)
  5. linux服务器间文件夹拷贝
  6. [译]Go如何优雅的处理异常
  7. Android/Java中使用Protobuf的Any类型实现泛型解析
  8. 同一页面引入多个JS文件的编码问题
  9. LeetCode 441. 排列硬币(数学解方程)
  10. bzoj1003题解
  11. 已知信码序列为1011_信息论与编码理论习题答案解析.doc
  12. php面试编程题_一位资深php程序员在北京的面试30个题目
  13. C++ Semaphore信号量使用
  14. [恢]hdu 2186
  15. 抽奖送福利|8大福利任性送,快来抽它
  16. 花书+吴恩达深度学习(二八)深度生成模型之有向生成网络(VAE, GAN, 自回归网络)
  17. git 解决冲突(6)
  18. java Guide 面试指南
  19. RTMP 两种方式推流:推H.264、ACC和推FLV封装格式
  20. 关于Maven,这些应该够用了

热门文章

  1. 在树莓派中安装MCSM面板
  2. 用c语言编写5颗骰子任意投掷总数为15 的概率,大工15春《应用统计》开卷考试期末复习题...
  3. Python网络数据爬取及分析-智联招聘
  4. Kafka 精妙的高性能设计(上篇)
  5. 企查查爬虫循环获取信息
  6. 信息系统项目管理-项目进度管理-(六)
  7. canvas 画一条波浪线 进度条
  8. java linkedblockingqueue_Java LinkedBlockingQueue take()用法及代码示例
  9. 简单的快递管理系统(c语言版)--大一下的总结
  10. c语言如何编写对数程序,在C语言中使用对数函数的方法