基础知识要求:
Java:方法、数组、逻辑运算符、for循环、if判断、字符串
Python: 方法、列表、逻辑运算符、for else语句、if判断、字符串
题目:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
思路解析:
- 边界情况处理:
- 如果字符串数组
strs
为空,直接返回空字符串""
。 - 如果字符串数组
strs
只有一个字符串,直接返回这个字符串。
- 如果字符串数组
- 初始化公共前缀:
- 假设第一个字符串
strs[0]
是最长公共前缀的初始值。
- 假设第一个字符串
- 比较每个字符串:
- 从第二个字符串开始,遍历
strs
中的每个字符串。 - 对于每个字符串,都将其与当前的公共前缀进行比较。
- 如果发现当前字符串的某个位置的字符与公共前缀的对应字符不匹配,或者当前字符串的长度已经小于公共前缀的长度,就更新公共前缀为该位置之前的所有字符(如果之前还有字符的话)。
- 从第二个字符串开始,遍历
- 更新逻辑:
- 在比较过程中,如果发现某个字符串比公共前缀短,或者某个位置的字符不匹配,就截断公共前缀到这个位置之前(包含当前位置)。
- 注意,每次更新公共前缀时,都是基于当前已经遍历过的字符串。
- 返回结果:
- 当遍历完所有字符串后,得到的公共前缀就是最长公共前缀。
- 返回这个最长公共前缀。
Java代码示例:
public class LongestCommonPrefix {
/**
* 找到字符串数组中的最长公共前缀
*
* @param strs 字符串数组
* @return 最长公共前缀,如果数组为空或所有字符串均为空,则返回空字符串
*/
public static String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
// 如果数组为空,则返回空字符串
return "";
}
// 假设第一个字符串为最长公共前缀的初始值
String prefix = strs[0];
// 从第二个字符串开始遍历
for (int i = 1; i < strs.length; i++) {
// 如果当前字符串为空,则最长公共前缀为空
if (strs[i].isEmpty()) {
// 返回空字符串作为结果
return "";
}
// 比较当前字符串与prefix
int j;
for (j = 0; j < Math.min(prefix.length(), strs[i].length()); j++) {
// 如果发现字符不匹配,截断prefix
if (prefix.charAt(j) != strs[i].charAt(j)) {
break;
}
}
// 更新prefix为已匹配的字符部分
prefix = prefix.substring(0, j);
// 如果prefix为空,则最长公共前缀为空,无需继续比较
if (prefix.isEmpty()) {
break;
}
}
// 返回最终得到的最长公共前缀
return prefix;
}
public static void main(String[] args) {
String[] strs1 = {"flower", "flow", "flight"};
System.out.println(longestCommonPrefix(strs1)); // 输出:"fl"
String[] strs2 = {"dog", "racecar", "car"};
System.out.println(longestCommonPrefix(strs2)); // 输出:""
}
}
在上面的代码中,我们首先处理了边界情况,包括空数组和空字符串。然后,我们初始化prefix
为数组中的第一个字符串,并从第二个字符串开始遍历数组。对于每个字符串,我们都将其与当前的prefix
进行比较,并在遇到不匹配的字符时截断prefix
。最后,我们返回得到的prefix
作为最长公共前缀。如果prefix
在遍历过程中变为空字符串,则说明不存在公共前缀,直接返回空字符串。
Python代码示例:
def longestCommonPrefix(strs):
if not strs: # 如果字符串数组为空,返回空字符串
return ""
# 获取第一个字符串作为最长公共前缀的初始候选
prefix = strs[0]
# 遍历字符串数组中的每个字符串
for i in range(1, len(strs)):
# 如果当前字符串为空,则最长公共前缀必定为空
if not strs[i]:
return ""
# 逐个比较当前候选前缀和当前字符串的字符
# 使用min函数确保我们不会超出较短字符串的长度
for j in range(min(len(prefix), len(strs[i]))):
if prefix[j] != strs[i][j]:
# 如果字符不匹配,则截断当前候选前缀
prefix = prefix[:j]
break
else:
# 如果循环正常结束(没有通过break跳出),说明已经比较完了较短的字符串
# 这时我们需要检查是否还需要继续比较更长的部分
if j < len(prefix) - 1:
# 如果还有未比较的部分,则截断当前候选前缀
prefix = prefix[:j + 1]
return prefix
# 示例测试
print(longestCommonPrefix(["flower", "flow", "flight"])) # 输出:"fl"
print(longestCommonPrefix(["dog", "racecar", "car"])) # 输出:""