您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么查找Java字符串最长的公共前缀
在编程中,查找一组字符串的最长公共前缀(Longest Common Prefix, LCP)是一个常见问题。本文将介绍几种在Java中实现这一功能的方法,并分析它们的优缺点。
## 问题描述
给定一个字符串数组,找出所有字符串共有的最长前缀。例如:
- 输入:`["flower","flow","flight"]`
- 输出:`"fl"`
如果不存在公共前缀,则返回空字符串 `""`。
## 方法一:水平扫描法
### 实现步骤
1. 以第一个字符串作为初始公共前缀 `prefix`。
2. 遍历剩余字符串,逐个与 `prefix` 比较,更新 `prefix` 为两者的公共前缀。
3. 如果 `prefix` 为空,提前终止循环。
### 代码示例
```java
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
}
return prefix;
}
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
for (int i = 0; i < strs[0].length(); i++) {
char c = strs[0].charAt(i);
for (int j = 1; j < strs.length; j++) {
if (i == strs[j].length() || strs[j].charAt(i) != c) {
return strs[0].substring(0, i);
}
}
}
return strs[0];
}
minLen
是最短字符串长度。public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
return divideAndConquer(strs, 0, strs.length - 1);
}
private String divideAndConquer(String[] strs, int left, int right) {
if (left == right) return strs[left];
int mid = (left + right) / 2;
String lcpLeft = divideAndConquer(strs, left, mid);
String lcpRight = divideAndConquer(strs, mid + 1, right);
return commonPrefix(lcpLeft, lcpRight);
}
private String commonPrefix(String a, String b) {
int minLen = Math.min(a.length(), b.length());
for (int i = 0; i < minLen; i++) {
if (a.charAt(i) != b.charAt(i)) {
return a.substring(0, i);
}
}
return a.substring(0, minLen);
}
minLen
。[0, minLen]
范围内进行二分查找。public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
int minLen = Integer.MAX_VALUE;
for (String str : strs) {
minLen = Math.min(minLen, str.length());
}
int low = 1, high = minLen;
while (low <= high) {
int mid = (low + high) / 2;
if (isCommonPrefix(strs, mid)) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return strs[0].substring(0, (low + high) / 2);
}
private boolean isCommonPrefix(String[] strs, int len) {
String prefix = strs[0].substring(0, len);
for (int i = 1; i < strs.length; i++) {
if (!strs[i].startsWith(prefix)) {
return false;
}
}
return true;
}
方法 | 时间复杂度 | 适用场景 |
---|---|---|
水平扫描 | O(S) | 通用 |
垂直扫描 | O(n*minLen) | 字符串长度差异大时 |
分治法 | O(S) | 需要并行处理时 |
二分查找 | O(S*log n) | 字符串长度较长时 |
选择合适的方法取决于具体场景和字符串特征。对于小规模数据,简单直观的水平/垂直扫描即可;大规模数据可考虑分治或二分查找优化。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。