目录

  • 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. 最长公共前缀 (简单)相关推荐

  1. leetcode系列-14. 最长公共前缀

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

  2. [模拟] leetcode 14 最长公共前缀

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

  3. LeetCode 14.最长公共前缀(字符串)

    上一篇博客:Leetcode 13.罗马数字转整数(字符串)  写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.最近萌生了刷LeetCode的 ...

  4. [leetcode] 14. 最长公共前缀

    14. 最长公共前缀 超级简单... class Solution { public:string longestCommonPrefix(vector<string> &strs ...

  5. 52 - 算法- leetcode 14 最长公共前缀

    // leetcode 14 最长公共前缀 str.sub(index1,index2)这个函数不清楚 // for(vector中的类class : vector) for 循环中的index 和 ...

  6. Leetcode 14.最长公共前缀(Longest Common Prefix)

    Leetcode 14.最长公共前缀 1 题目描述(Leetcode题目链接)   编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 输入: ...

  7. LeetCode 14. 最长公共前缀 (单指针水平扫描)

    14. 最长公共前缀 题意: 找出一个字符串数组中所有字符串的最长公共前缀,如果不存在返回"" 思路: 假设数组第一个元素就是ans 从下标1开始遍历数组 用一个指针水平扫描ans ...

  8. Leetcode刷题-最长公共前缀

    Leetcode刷题-最长公共前缀 简介 题目 个人答案及结果 学习一下官方的 简介 最近尝试下大家口口相传的神器 leetcode-cn.com,大家自己注册就可以选择题库进行使用了.我都会先自己出 ...

  9. LeetCode 13罗马数字转整数14最长公共前缀

    罗马数字转整数 上一题是整数转罗马数字,这题是罗马数字转整数.虽然是简单题,但我感觉其实有点烦. 上一次是数字转字符,这次是字符转数字,总的来说大体思想还是差不多的. 首先整个字符串可能是这样构造的: ...

  10. LeetCode 14. 最长公共前缀

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

最新文章

  1. Keras【Deep Learning With Python】更优模型探索Keras实现CNN
  2. 使用report clear appointment的all day flag
  3. JavaScript中的原型和对象机制
  4. 输入一行电报文字,将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)
  5. java中for的增强用法,Java中增强for循环的用法
  6. linux kernel基本构成的内容有下列哪些项_Linux内核线程kernel thread详解
  7. ad中那个快捷键是重复上一部_Excel中的F4快捷键用的好,告别加班没烦恼!
  8. mysqluuid去除横岗
  9. 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
  10. Codeforces Round #595 (Div. 3) E. By Elevator or Stairs?
  11. 微信公众号消息模板——Java
  12. 【Tools系列】OneNote 2016 中同步笔记时出现0xE4010640错误
  13. 自动化测试处理银行密码输入框
  14. win10电脑360调用不到JAVA,windows10系统下360浏览器打不开网页如何解决
  15. python的基本统计和分组分析和分布分析和交叉分析和结构分析
  16. c/c++通过域名解析ip地址
  17. 用c语言计算高考成绩,C语言计算距离高考剩余时间
  18. Jackson ImmunoResearch普通羊驼血清说明书
  19. Excel中两列数据对比,找出不同数据如何查找重复项并统计重复次数
  20. 读书百客:《相思》鉴赏

热门文章

  1. graphics.h头文件图形绘画详解(史上最详细)
  2. 手机控制云服务器文件,手机控制云服务器文件
  3. (转) 行人检测资源 综述文献
  4. 扫盲:云计算、大数据和人工智能
  5. KATKO KEM640U开关
  6. ANSYS LSDYNA时间步设置
  7. 从Appstore宕机看DNS解析的重要性
  8. win python 判断 所有 子进程 结束_python 多进程如何终止或重启子进程?
  9. 「Python开发者」公号招内容编辑
  10. Android手机直播系统开发介绍