1. 题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
Related Topics 字符串
👍 1247 👎 0
2. 题解
2.1 解法1: 横向扫描
先取两个字符串比较,寻找最长公共前缀,然后依次比较, 注意比较时, 下标要小于两个字符串的长度
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String sameStr = strs[0];
for (int i = 1; i < strs.length; i++) {
int j = 0;
while (j < sameStr.length() && j < strs[i].length() && sameStr.charAt(j) == strs[i].charAt(j)) {
j++;
}
sameStr = sameStr.substring(0, j);
if (sameStr.length() == 0) {
return sameStr;
}
}
return sameStr;
}
}
2.2 解法2: 排序后比较首尾
- 先将字符串数组按字典序排序, 然后比较首尾字符串公共前缀即为最长的
把字符串的相同项归类了,再输出不同值之前的相同项
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) {
return "";
}
Arrays.sort(strs);
String firstStr = strs[0];
String lastStr = strs[strs.length - 1];
int size = Math.min(firstStr.length(), lastStr.length());
int j = 0;
while (j < size && firstStr.charAt(j) == lastStr.charAt(j)) {
j++;
}
return firstStr.substring(0, j);
}
}
参考: 画解算法:14. 最长公共前缀