描述
给你一个长度为 nn 的字符串数组 strsstrs , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。
数据范围:
0 \le n \le 10000≤n≤1000
0 \le len(strs[i]) \le 50000≤len(strs[i])≤5000
示例1
输入:
["abca","abc","abca","abc","abcc"]
复制返回值:
"abc"
复制
解法一:纵向扫描
- 将字符串数组看作一个二维空间,每一次从第一列开始。
- 确定所有字符子串中第一列字符。
- 逐层扫描后面每一列,遇到不同字符停止扫描。
- 图解:
-
![图片说明](https://i-blog.csdnimg.cn/blog_migrate/90fcb29b0e8457a3c0db81bc8814045b.png)
Java参考代码:
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 | import java.util.*; public class Solution { /** * * @param strs string字符串一维数组 * @return string字符串 */ public String longestCommonPrefix (String[] strs) { // //纵向扫描 if (strs.length== 0 || strs== null ){ return "" ; } int rows = strs.length; int cols = strs[ 0 ].length(); //开始扫描 for ( int i= 0 ;i<cols;i++){ char firstChar = strs[ 0 ].charAt(i); for ( int j= 1 ;j<rows;j++){ if (strs[j].length()==i || strs[j].charAt(i)!=firstChar){ return strs[ 0 ].substring( 0 ,i); } } } return strs[ 0 ]; } } |
复杂度分析:
时间复杂度:O(M*N) 其中 M 是字符串数组中的字符串的平均长度,N是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次
空间复杂度:O(1) 常数空间的复杂度
解法二:横向扫描
- 首先确定第i个与第i+1个字符串子串相同的公共前缀K。
- 将上面找到的前缀K与第i+2个子串进行对比,得到他们的公共前缀K1
- 重复上述步骤,最终得到字符串的最长公共前缀
- 图解
-
![图片说明](https://i-blog.csdnimg.cn/blog_migrate/9b9c4f3b97f9a3bb18afa19cb087f185.png)
Java参考代码:
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 | import java.util.*; public class Solution { /** * * @param strs string字符串一维数组 * @return string字符串 */ public String longestCommonPrefix (String[] strs) { // 横向扫描 if (strs.length== 0 || strs== null ){ return "" ; } //以第一个字符开始 String prefix = strs[ 0 ]; for ( int i= 1 ;i<strs.length;i++){ prefix = GetCommonPrefix(prefix,strs[i]); //表示最长公共前缀就是"" if (prefix.length()== 0 ){ return "" ; } } return prefix; } //返回两子串公共前缀函数 public String GetCommonPrefix(String s1,String s2){ int len= Math.min(s1.length(),s2.length()); int flag= 0 ; while (flag<len && s1.charAt(flag)==s2.charAt(flag)){ flag++; } return s1.substring( 0 ,flag); } } |