Leetcode刷题-最长公共前缀
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;}
学习一下官方的
了不得啊,官方给了三种方案 最长公共前缀-官方答案(视频)
简单介绍一下
水平扫描法,就是我上面写的
分治法
先遍历前半部分,后遍历后半部分
代码
/*** 分治法(先遍历前半部分,后遍历后半部分)*/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;}
- 二分法
找到最短的字符串,分为两个字符串,分别与所有字段比较
/*** 二分法官方(找到最短的字符串,分为两个字符串,分别与所有字段比较)*/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: 输入:strs = ["flower","flo ...
- leetcode算法题--最长公共前缀
原文链接:https://leetcode-cn.com/problems/longest-common-prefix/ 纵向扫描 string longestCommonPrefix(vector& ...
- LeetCode题组:第14题-最长公共前缀
1.题目:最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",&quo ...
- 刻意练习:LeetCode实战 -- Task14. 最长公共前缀
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- LeetCode实战:最长公共前缀
题目英文 Write a function to find the longest common prefix string amongst an array of strings. If there ...
- 算法题---最长公共前缀
题目来源:https://leetcode-cn.com/problems/longest-common-prefix/ 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符 ...
- 【Leetcode | easy】最长公共前缀
题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&q ...
- [Leedcode][JAVA][第14题][最长公共前缀][二分][横竖扫描][分治]
[问题描述][中等] 编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "".示例 1:输入: ["flower","f ...
- 20190825:(leetcode习题)最长公共前缀
最长公共前缀 题目 大致思路 代码实现 题目 大致思路 我们以第一个字符串为准,将后面的字符串与第一个进行比较即可. 比较时,将后续字符串依次与第一个字符串逐字符进行对比,相同的则append到Str ...
最新文章
- 替换 RHEL5的yum源为CentOS5源,亲测线上系统可用
- error code [17027]; 流已被关闭;
- 你可以不知道的JS二
- ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)
- linux服务器间文件夹拷贝
- [译]Go如何优雅的处理异常
- Android/Java中使用Protobuf的Any类型实现泛型解析
- 同一页面引入多个JS文件的编码问题
- LeetCode 441. 排列硬币(数学解方程)
- bzoj1003题解
- 已知信码序列为1011_信息论与编码理论习题答案解析.doc
- php面试编程题_一位资深php程序员在北京的面试30个题目
- C++ Semaphore信号量使用
- [恢]hdu 2186
- 抽奖送福利|8大福利任性送,快来抽它
- 花书+吴恩达深度学习(二八)深度生成模型之有向生成网络(VAE, GAN, 自回归网络)
- git 解决冲突(6)
- java Guide 面试指南
- RTMP 两种方式推流:推H.264、ACC和推FLV封装格式
- 关于Maven,这些应该够用了
热门文章
- 在树莓派中安装MCSM面板
- 用c语言编写5颗骰子任意投掷总数为15 的概率,大工15春《应用统计》开卷考试期末复习题...
- Python网络数据爬取及分析-智联招聘
- Kafka 精妙的高性能设计(上篇)
- 企查查爬虫循环获取信息
- 信息系统项目管理-项目进度管理-(六)
- canvas 画一条波浪线 进度条
- java linkedblockingqueue_Java LinkedBlockingQueue take()用法及代码示例
- 简单的快递管理系统(c语言版)--大一下的总结
- c语言如何编写对数程序,在C语言中使用对数函数的方法