最长公共前缀
今天的题目是力扣面试经典150题中的数组的简单题: 最长公共前缀
题目链接:https://leetcode.cn/problems/longest-common-prefix/description/?envType=study-plan-v2&envId=top-interview-150
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
- 示例:
- 输入:
[“flower”,“flow”,“flight”] - 输出:
“fl” - 解释:
公共前缀为"fl"。 - 输入:
[“dog”,“racecar”,“car”] - 输出:
“” - 解释:
没有公共前缀。
- 输入:
题目分析
题目要求我们找到一个字符串数组中的最长公共前缀。最长公共前缀指的是所有字符串共有的最长初始部分。也就是找出所有字符串中从第一位开始相同且不间断的字符。
没有想到特别的算法,只能使用暴力解法,两两互相比较前缀。注意是使用比较后的前缀与下一个元素进行比较。第一个元素默认前缀是自己。
解题思路
暴力解法-逐字符比较法:
- 定义第一个元素最为基础前缀(第一个元素前缀是自己)
- 从第二个元素开始循环数组,同时当前元素与当前前缀比较获取最新的前缀。
- 循环比较
- 返回公共前缀
实际算法代码
根据以上分析,我们可以写出以下代码:
package algorithm.day008;
public class LongestCommonPrefix {
public static void main(String[] args) {
LongestCommonPrefix solution = new LongestCommonPrefix();
// 示例数据
String[] strs = {"flower", "flow", "flight"};
// 调用计算最长公共前缀的方法
String lcp = solution.longestCommonPrefix(strs);
// 输出结果
System.out.println("The longest common prefix is: " + lcp);
}
/**
* 查找字符串数组中的最长公共前缀
*
* @param strs 字符串数组
* @return 最长公共前缀
*/
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
String prefix = strs[0];
int count = strs.length;
for (int i = 1; i < count; i++) {
prefix = longestCommonPrefix(prefix, strs[i]);
if (prefix.length() == 0) {
break;
}
}
return prefix;
}
private String longestCommonPrefix(String str1, String str2) {
// 获取较小的长度进行循环
int length = Math.min(str1.length(), str2.length());
StringBuilder sb = new StringBuilder();
// 获取公共前缀
for (int i = 0; i < length; i++) {
if (str1.charAt(i) == str2.charAt(i)) {
sb.append(str1.charAt(i));
} else {
break;
}
}
return sb.toString();
}
}
结果
运行函数,结果符合要求:
提交到力扣也正常通过。
总结
暴力解法是最常见得到解法,但是力扣中还有更加优秀的解法值得学习,多学习其中的优秀解法,能很大提升自己的编码能力。
加油!!!