最长公共前缀

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

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

示例 1:

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

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

首先考虑边界情况,如果字符串数组为空,则返回“ ”。

对于非空字符串数组,拿出第一个字符串fs作为基准串,纵向对比数组字符串的每一个位置,直到出现不同的字符或者长度不一致时,返回已经匹配的子串。

 1 class Solution {
 2     public String longestCommonPrefix(String[] strs) {
 3         if (strs.length == 0)
 4         {return "";}
 5         String fs=strs[0];
 6         for (int i=0;i<fs.length();i++)
 7         {
 8             char temp = fs.charAt(i);
 9             for (int j=1;j<strs.length;j++)
10             {
11                 if (i>(strs[j].length()-1) || temp!= strs[j].charAt(i) )
12                 {
13                     return new String(fs.substring(0,i));
14                 }
15             }
16         }
17         return fs;
18     }
19 }
执行结果:
通过
执行用时 :1 ms, 在所有 Java 提交中击败了84.91%的用户
内存消耗 :36.1 MB, 在所有 Java 提交中击败了87.38%的用户
 
在评论里看到另一种解法
 1 public String longestCommonPrefix(String[] strs) {
 2     if (strs == null || strs.length == 0  ) return "";
 3     String reg = strs[0];
 4     for (String str : strs){
 5         while (!str.startsWith(reg)) {
 6             if (reg.length() == 1) {
 7                 return "";
 8             }
 9             reg = reg.substring(0, reg.length()-1);
10         }
11     }
12     return reg;
13 }

用了startsWith()来判断reg是否为公共前缀,如果不一致返回0进入循环,考虑了数组只有一个字符串的情况。reg去掉尾字符,继续循环。

这种做法从基准串尾开始比对,只遍历整个数组一次,循环中每次进行一次前缀比较,而我的做法要遍历整个数组(最长公共前缀长)次,每次进行(数组长度-1)次字母比较,虽然本质上时间复杂度都是O(m*n),但感觉上和实际上这种做法更快一些。

posted @ 2020-01-12 23:20  zjcfrancis  阅读(707)  评论(0编辑  收藏  举报