题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例:
示例1:
输入: ["flower","flow","flight"] 输出: "fl"
示例2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
题目难度:简单
分析:
要注意题目是要找公共前缀,不是子串,前缀的意思就是说前面必须是一样的。首先可以假设下标为0的元素就是目前找到的最长公共前缀,然后从下标1开始遍历,看看当前元素与第0个元素的公共前缀是什么,比较他们的长度,取较短的就是这次循环结束后的公共前缀了。以此类推,代码如下:
class Solution { public String longestCommonPrefix(String[] strs) { // 由题意可知,数组为空是返回空字符串,只有一个元素的时候它就是最长的公共前缀 if (strs.length == 0) { return ""; } else if (strs.length == 1) { return strs[0]; } // 首先假设下标为0的元素就是目前最长的公共前缀 String str0 = strs[0]; int minCount = str0.length(); for (int i = 1; i < strs.length; i++) { int count = 0; String temp = strs[i]; for (int j = 0; j < temp.length(); j++) { /* 这里直接调用了api,从当前元素的第0位开始和数组的第0个元素比较, 直到找到不包含的元素即可知道公共前缀的长度了。 */ if (str0.startsWith(temp.substring(0, j + 1))) { count++; } else { break; } } // 当找到公共前缀以后和minCount比较,取较小 minCount = Math.min(minCount, count); } // 只需返回截取以后的最长前缀即可 return str0.substring(0, minCount); } }
总结:
时间复杂度O ( n ) ,n是所有字符加在一起的长度。代码很简单,思路也比较清晰,缺点就是需要比较很多次,效率不高。改进的方法就是采用分治法。