题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
输入输出示例:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。
提示信息:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
解题思路:
通过分析我们可以知道,字符串的最长的公共子前缀长度最多不能超过原先最短的字符串,我们可以假设初始的公共前缀是第一个字符串,然后通过for循环,依次比较这个前缀prefix和当前的字符串,去寻找当前的字符串和这个前缀的最长子前缀,依次遍历字符串数组,直至所有的字符串都遍历完毕,
在判断子前缀时,也要遵循,子前缀的长度不能超过最短的字符串长度,所以我们还需要通过Math.min()方法来获取到循环的终止点。
具体代码如下:
package com.string;
/**
* @Name: No14_longestCommonPrefix
* @Description: 最长公共前缀
* https://leetcode-cn.com/problems/longest-common-prefix/
* @Author: panlai
* @Date: 2021/8/12 11:35
*/
public class No14_longestCommonPrefix {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0){
return "";
}
int n = strs.length;
String prefix = strs[0];
//for循环遍历字符串数组,获取到最长前缀
for (int i = 0; i < n; i++) {
prefix = currentPrefix(prefix,strs[i]);
if (prefix == ""){ //经过一次比较厚,一旦前缀为空,则已经出现没公共前缀的元素,直接break;
break;
}
}
return prefix;
}
}
//用来比较当前字符串和已经存储到的前缀,获取新的最长前缀
public String currentPrefix(String str1,String str2){
int len = Math.min(str1.length(),str2.length());
int i;
for (i= 0; i < len; i++) {
if (str1.charAt(i)!=str2.charAt(i)){
break;
}
}
return str1.substring(0,i);
}
}