【LeetCode - Java】14. 最长公共前缀 (简单)
目录
- 1. 题目描述
- 2. 解题思路
- 3. 代码实现
- 3.1 横向扫描
- 3.2 横向扫描(优化储存)
- 3.3 纵向扫描
- 3.4 横向扫描(逆序)
- 3.5 对比
1. 题目描述
2. 解题思路
对于一个数组的常规处理思路一般都是先遍历数组,取出其中的字符串再进行操作,后来瞅了一眼官解中把这种方法命名为横向扫描(反正我自己是没想出来这个命名)。这种思路是最简单的思路,我以数组中的第一个字符串为最长公共前序对比基准,不符合则退一位。
最开始敲码的时候第一反应就是把字符串转换成字符数组,再进行字符的比较,提交后发现这个算法占用的储存空间不太理想(废话,多了两个数组肯定不理想),翻了一下发现String
类有个charAt()
方法(当时已经完全忘掉了),可以直接取字符串中的字符,然后优化了一下储存空间果然理想了一点。
当有了基本思路之后开始想一些骚操作了,既然可以对每个字符串进行一一扫描比较,那么我也可以先对所有字符串中的字符进行一一逐位比较,这种方法在官解中也有,被称为纵向扫描。可能有点难理解,有兴趣的可以去看看官解的配图,这里就不贴了。
除此以外,还有什么方法吗?其实还是有的,横向扫描常规肯定是对字符串进行从前往后扫,我们可以反其道而行之,对当前记录的最大公共前缀索引开始从后往前扫描比较。
3. 代码实现
3.1 横向扫描
public String longestCommonPrefix(String[] strs) {char[] chars = strs[0].toCharArray();int length = chars.length;int min = length;int s = 0;for (int i = 1; i < strs.length; i++) {//遍历数组char[] chars1 = strs[i].toCharArray();int length1 = chars1.length;for (int i1 = 0; i1 < min(length, length1); i1++) {//遍历字符串if (chars[i1] == chars1[i1]) {s++;} else {break;}}if (s < min) {min = s;}s = 0;}StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < min; i++) {stringBuilder.append(chars[i]);}return new String(stringBuilder);}private int min(int length, int length1) {if (length < length1)return length;elsereturn length1;}
3.2 横向扫描(优化储存)
public String longestCommonPrefix(String[] strs) {int length = strs[0].length();int min = length;int s = 0;int length1;for (int i = 1; i < strs.length; i++) {//遍历数组length1 = strs[i].length();for (int i1 = 0; i1 < min(length, length1); i1++) {//遍历字符串if (strs[0].charAt(i1) == strs[i].charAt(i1)) {s++;} else {break;}}if (s < min) {min = s;}s = 0;}return strs[0].substring(0, min);}private int min(int length, int length1) {if (length < length1)return length;elsereturn length1;}
该种算法为所尝试算法中的最优:
3.3 纵向扫描
public String longestCommonPrefix(String[] strs) {for (int i = 0; i < strs[0].length(); i++) {//遍历字符串for (String str : strs) {//遍历数组try {if (str.charAt(i) != strs[0].charAt(i))return strs[0].substring(0, i);}catch (Exception e){return strs[0].substring(0, i);}}}return strs[0];}
3.4 横向扫描(逆序)
public String longestCommonPrefix(String[] strs) {int maxIndex = strs[0].length() - 1;int rr;for (int i = 1; i < strs.length; i++) {//遍历数组if (strs[i].length() - 1 < maxIndex) {maxIndex = strs[i].length() - 1;}rr = maxIndex;while (rr >= 0) {//遍历字符串if (strs[0].charAt(rr) != strs[i].charAt(rr)) {maxIndex = rr-1;}rr--;}}return strs[0].substring(0, maxIndex + 1);}
3.5 对比
可以看出,几种算法的运行时间并没有什么变化,因为他们的时间复杂度都是O(mn),m为数组长度,n为字符串长度。因此,即使包括官解中的二分法和分治等方法也不会有明显的改变(虽然我想不出来),个人感觉只是为了炫技的存在,对时间复杂度也没有进行优化。
【LeetCode - Java】14. 最长公共前缀 (简单)相关推荐
- leetcode系列-14. 最长公共前缀
题目描述:编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:strs = ["flower"," ...
- [模拟] leetcode 14 最长公共前缀
[模拟] leetcode 14 最长公共前缀 1.题目 题目链接 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例1: 输入: [& ...
- LeetCode 14.最长公共前缀(字符串)
上一篇博客:Leetcode 13.罗马数字转整数(字符串) 写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.最近萌生了刷LeetCode的 ...
- [leetcode] 14. 最长公共前缀
14. 最长公共前缀 超级简单... class Solution { public:string longestCommonPrefix(vector<string> &strs ...
- 52 - 算法- leetcode 14 最长公共前缀
// leetcode 14 最长公共前缀 str.sub(index1,index2)这个函数不清楚 // for(vector中的类class : vector) for 循环中的index 和 ...
- Leetcode 14.最长公共前缀(Longest Common Prefix)
Leetcode 14.最长公共前缀 1 题目描述(Leetcode题目链接) 编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 输入: ...
- LeetCode 14. 最长公共前缀 (单指针水平扫描)
14. 最长公共前缀 题意: 找出一个字符串数组中所有字符串的最长公共前缀,如果不存在返回"" 思路: 假设数组第一个元素就是ans 从下标1开始遍历数组 用一个指针水平扫描ans ...
- Leetcode刷题-最长公共前缀
Leetcode刷题-最长公共前缀 简介 题目 个人答案及结果 学习一下官方的 简介 最近尝试下大家口口相传的神器 leetcode-cn.com,大家自己注册就可以选择题库进行使用了.我都会先自己出 ...
- LeetCode 13罗马数字转整数14最长公共前缀
罗马数字转整数 上一题是整数转罗马数字,这题是罗马数字转整数.虽然是简单题,但我感觉其实有点烦. 上一次是数字转字符,这次是字符转数字,总的来说大体思想还是差不多的. 首先整个字符串可能是这样构造的: ...
- LeetCode 14. 最长公共前缀
1. 题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1:输入: ["flower","flow ...
最新文章
- Keras【Deep Learning With Python】更优模型探索Keras实现CNN
- 使用report clear appointment的all day flag
- JavaScript中的原型和对象机制
- 输入一行电报文字,将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)
- java中for的增强用法,Java中增强for循环的用法
- linux kernel基本构成的内容有下列哪些项_Linux内核线程kernel thread详解
- ad中那个快捷键是重复上一部_Excel中的F4快捷键用的好,告别加班没烦恼!
- mysqluuid去除横岗
- 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
- Codeforces Round #595 (Div. 3) E. By Elevator or Stairs?
- 微信公众号消息模板——Java
- 【Tools系列】OneNote 2016 中同步笔记时出现0xE4010640错误
- 自动化测试处理银行密码输入框
- win10电脑360调用不到JAVA,windows10系统下360浏览器打不开网页如何解决
- python的基本统计和分组分析和分布分析和交叉分析和结构分析
- c/c++通过域名解析ip地址
- 用c语言计算高考成绩,C语言计算距离高考剩余时间
- Jackson ImmunoResearch普通羊驼血清说明书
- Excel中两列数据对比,找出不同数据如何查找重复项并统计重复次数
- 读书百客:《相思》鉴赏