//编写一个函数来查找字符串数组中的最长公共前缀。
//
// 如果不存在公共前缀,返回空字符串 ""。
//
// 示例 1:
//
// 输入: ["flower","flow","flight"]
//输出: "fl"
//
//
// 示例 2:
//
// 输入: ["dog","racecar","car"]
//输出: ""
//解释: 输入不存在公共前缀。
//
//
// 说明:
//
// 所有输入只包含小写字母 a-z 。
// Related Topics 字符串
// 👍 1328 👎 0
package leetcode.editor.cn;
//Java:最长公共前缀
public class P14LongestCommonPrefix {
public static void main(String[] args) {
Solution solution = new P14LongestCommonPrefix().new Solution();
// TO TEST
String[] strs = {"flower", "flow", "flight"};
String s = solution.longestCommonPrefix(strs);
System.out.println(s);
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0)
return "";
int index = 0;
int maxIndex = getMinLen(strs);
StringBuilder stringBuilder = new StringBuilder();
while (index < maxIndex) {
char curChar = strs[0].charAt(index);
for (int i = 1; i < strs.length; i++) {
if (strs[i].charAt(index) != curChar)
return stringBuilder.toString();
}
stringBuilder.append(curChar);
index++;
}
return stringBuilder.toString();
}
public int getMinLen(String[] strs) {
int minLen = strs[0].length();
for (int i = 1; i < strs.length; i++) {
minLen = strs[i].length() < minLen ? strs[i].length() : minLen;
}
return minLen;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
时间复杂度O(mn),其中m为字符串平均长度,空间复杂度O(1)
其他思路
- 横向搜索,求1,2的最长公共前缀,得到结果和3继续求前缀,遍历到最后一个字符串,时间复杂度O(mn)
- 递归,字符数组拆成两半,分别求左右两半的公共前缀,再合并求最终的公共前缀,递归出口为当前拆分的字符串数量为1,时间复杂度O(mn)