【发布时间】:2014-01-27 16:43:02
【问题描述】:
我写的这个算法是为了检查一个字符串是否是数组中另一个字符串的前缀。 复杂度为 O(n*(n-1)*k),其中 n 是数组中字符串的数量, K 是字符串的最大长度。我在做复杂性分析吗?
public static void isPrefix(String[] strs){
for(int i=0; i<strs.length; i++){
for(int j=i+1; j<strs.length; j++){
String a = strs[i];
String b = strs[j];
if(!commonStr(a,b).isEmpty()){
System.out.println(a + "->" + b);
}
}
}
}
private static String commonStr(String a, String b){
int smaller = Math.min(a.length(), b.length());
for(int k=0; k<smaller; k++){
if(a.charAt(k) != b.charAt(k)){
return "";
}
}
return a.substring(0,smaller);
}
public static void main(String[] args){
String[] strs = {"ab", "abc", "cde", "abef"};
isPrefix(strs);
}
【问题讨论】:
-
可能是个愚蠢的问题(而且完全跑题了),但为什么不使用startsWith呢?
-
如果您在数组中添加或删除单词并且想要检查前缀很多时间,也许您应该考虑使用另一种数据结构,例如 Trie:en.wikipedia.org/wiki/Trie
-
是的,尝试更好,但仅用于 BigO 分析
-
startsWith 不错,但是这里只想写算法分析一下。