给定参考字符串X和电子串Y,计算X在Y中不发生的百分比。 含义:例如
X = ABCD
和Y = ABCDABRR
然后我们的百分比为2/8 = 0.25,因为2RR与ABCD = X
没有对齐,还有一个例子,X = ABCD, Y = ABCDABRD
然后是1/8。
public static void main(String[] args) {
String mainS = "ABCDEABCDERRCRR";
String ref = "ABCDE";
double fails = 0; //count the fails.
double len = mainS.length(); //length of main String.
for(int i = 0; i < len; i++){
String charAti = mainS.substring(i, i+1);
if(ref.contains(charAti)){
//PASS
} else{
++fails;
}
}
double ratio = fails/len;
System.out.println("Failure ratio is: " + ratio);
}
这可行,我相信O(N)
,但我可以加快速度吗?
答案 0 :(得分:1)
对于您提供的参数,其中ref很短,这是一种非常合理的方法。但是,您多次调用contains()。 Java文档没有指定此函数的实现或复杂性,但在一般情况下,需要查看一个字符串是否包含另一个字符串,因此每次调用contains()的成本可能至少会线性增长搜索字符串的长度。您的复杂性可能更准确地描述为O(mn),其中m和n是所涉及的两个字符串的长度。
如果您使用ref字符串填充HashSet字符,并且测试mainS中的每个字符以查看是否包含在HashSet中,那么您的理论复杂度会更低,因为每个此类测试仅花费O(1)而不管HashSet的大小,反映了ref的长度。