题目:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:所有输入只包含小写字母 a-z 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
思路:
这个题也很简单,只需要拿第一个字符串的每一个字符依次去和其他字符串比较,直到越界或者不再全部相同为止。
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length < 1) return "";
if (strs.length == 1) return strs[0];
StringBuilder result = new StringBuilder();
boolean equal = true;
// 遍历第一个字符串的每一个字符
for (int i = 0; equal && i < strs[0].length(); i++) {
char currentChar = strs[0].charAt(i);
// 比对其他字符串的相同位置的字符是否相同
for (int j = 1; equal && j < strs.length; j++) {
if (strs[j].length() <= i || currentChar != strs[j].charAt(i)) {
equal = false;
}
}
if (equal) {
result.append(currentChar);
}
}
return result.toString();
}
}
时间复杂度:O(mn),m是字符串的个数,n是字符串的最短长度
空间复杂度:O(1)
官方解法:
上面的方法我认为应该是最优解法了,官方将这个解法命名为纵向扫描;还有横向扫描,也就是先比较两个,得出一个公共前缀,再拿这个公共前缀和第三个字符比较……如此下去,比对完所有字符串之后得到的就是整体的公共前缀了。
上面的横向扫描,其实也能进一步想到可以用分治法,两两对比得结果,然后再两两对比。
还有一个“二分查找”的方法我没仔细看。
但是,我认为上面这些方法并没有实际上降低计算的复杂度,只是从不同角度来解决问题而已。所以对于一个如此简单的问题,其实没必要搞得过于复杂。纵向扫描解决就好了。
耗时:20分钟