要求
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
原题:最长公共前缀
示例 1:
1 2
| 输入:strs = ["flower","flow","flight"] 输出:"fl"
|
示例 2:
1 2 3
| 输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
|
思路
如果只考虑只有两个字符串,找出他们的公共前缀
那么只需要使用 charAt()
方法来一个字符一个字符的比较,就可以得到他们的公共前缀(这里先不考虑特殊情况,假设存在公共前缀)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
private String getCommonPrefix(String str1, String str2) { int minLength = Math.min(str1.length(), str2.length()); int index = 0; while (index < minLength && str1.charAt(index) == str2.charAt(index)) { index++; } return str1.substring(0, index); }
|
在得到了两个字符串的公共前缀后,我们可以将得到的公共前缀作为一个新的字符串,那么我们只需要拿这个字符串和下一个字符串继续进行比较,最后就可以得到所有字符串的公共字符串了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Solution { public String longestCommonPrefix(String[] strs) { if (strs.length == 0 || strs == null) { return ""; } String commonPrefix = strs[0]; for (int i = 1; i < strs.length; i++) { commonPrefix = getCommonPrefix(commonPrefix, strs[i]);
if (commonPrefix.length() == 0) { break; } } return commonPrefix; }
private String getCommonPrefix(String str1, String str2) { int minLength = Math.min(str1.length(), str2.length()); int index = 0; while (index < minLength && str1.charAt(index) == str2.charAt(index)) { index++; } return str1.substring(0, index); } }
|
复杂度分析
时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串数组中的字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
空间复杂度:O(1),使用的额外空间复杂度为常数。