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;
        }
    越努力越幸运~ 加油ヾ(◍°∇°◍)ノ゙
  • 相关阅读:
    jsp标签${fn:contains()}遇到问题记录
    maven更改本地的maven私服
    elk使用记录
    dubbo 报错问题记录:may be version or group mismatch
    mybatis自动生成后无法获取主键id问题
    tomcat关闭异常导致的项目无法重启
    jsp 记录
    spring bean
    JDBC
    el表达式
  • 原文地址:https://www.cnblogs.com/utomboy/p/12426819.html
Copyright © 2011-2022 走看看