zoukankan      html  css  js  c++  java
  • 【嘎】字符串-最长公共前缀

    题目:编写一个函数来查找字符串数组中的最长公共前缀。

    如果不存在公共前缀,返回空字符串 ""。

    示例 1:

    输入: ["flower","flow","flight"]
    输出: "fl"
    示例 2:

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

    解释: 输入不存在公共前缀。


    说明:

    所有输入只包含小写字母 a-z 。

    又是很慢的写法 :(

     1 class Solution {
     2     public String longestCommonPrefix(String[] strs) {
     3         // 一开始没有判断
     4         if (strs == null || strs.length < 1) {
     5             return "";
     6         }
     7         if (strs.length == 1) {
     8             return strs[0];
     9         }
    10         boolean hasFlag = false;
    11         String initstr = strs[0];
    12         for (int i = 1; i < strs.length; i++) {
    13             String str1 = initstr;
    14             String str2 = strs[i];
    15             String temp = ""; // 这里不能去掉,每次循环的时候都要重新归零
    16             int len = str1.length() > str2.length()? str2.length():str1.length();
    17             // substring不包含第二个参数,一开始这里没有考虑到
    18             for (int j = 1; j <= len; j++) {
    19                 if (str1.substring(0, j).equals(str2.substring(0,j))) {
    20                     hasFlag = true;
    21                     temp = str1.substring(0, j);
    22                 }
    23             }
    24             initstr = temp;
    25             // 有相同的
    26             if (hasFlag) {
    27 
    28             } else {
    29                 return "";
    30             }
    31         }
    32         return initstr;
    33     }
    34 }

    本来想优化优化代码,然后越写越糟糕。。。后来发现写的每一步都减不了。。然后还是看看大佬的解答

     果然,我们不一样。。。突然想起当时看到题目想到了indexOf,然后就忘了

    官方:

    方法一:水平扫描法

     就是利用indexOf,将第一个作为prefix,然后当遍历1之后每个不是以他为头的就将prefix减少一位

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

    看了这个代码,我发现我原先的7-9行是不需要的,在执行时间上没啥区别,但是也是冗余了~~

    官方还有其他几种解法,下面是一位受官方启发写出来的

        public String longestCommonPrefix2(String[] strs) {
            if (strs.length == 0) {
                return "";
            }
            String ans = strs[0];
            for (int i = 1; i < strs.length; i++) {
                int j = 0;// 妙米生花!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                for (; j < strs[i].length() && j < ans.length(); j++) {
                    if (ans.charAt(j) != strs[i].charAt(j)) {
                        break;
                    }
                }
                ans = ans.substring(0, j);
    
                if (ans.equals("")) {
                    return ans;
                }
            }
    
            return ans;
        }
    越努力越幸运~ 加油ヾ(◍°∇°◍)ノ゙
  • 相关阅读:
    2017-3-13 SQL server 表连接
    2017-3-13 SQL server 函数(聚合函数,数学函数,字符串函数,转换函数,时间日期函数)
    2017-3-10 SQL server T-sql语句 高级查询
    2017-3-10 SQL server 数据库 T--SQL语句
    layer框架使用的问题汇总
    pulic——功能性(自己写完测试的)list转树
    bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)
    临时笔记0318
    最简单的多线程代码,一句话就可以使用
    scrollview滑动到某区域执行某种方法
  • 原文地址:https://www.cnblogs.com/utomboy/p/12426819.html
Copyright © 2011-2022 走看看