我写了下面的代码,用于查找给定的char数组是否是主数组的子字符串。 请告知以下代码的最佳案例和最坏情况的复杂顺序。
我觉得这是一种非常有效的算法,具有O(mainstring.lenth-substring.length)最坏情况的复杂性。
public class SubstringOfString {
public static boolean isSubstring (char[] main , char[] sub){
int base=0 ;
int i=0;
while(i<sub.length){
if(sub[i]!=main[base] && i >0 ){
base=base-i;
if (base>main.length-sub.length){
System.out.println("not found");
return false;
}
}
else {
i++;base++;
}
}
if (i==sub.length){
System.out.println("found at"+(base-sub.length));
return true;
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] main = "i am hello as hello well".toCharArray();
char[] sub="hello".toCharArray();
SubstringOfString.isSubstring(main,sub);
}
}
答案 0 :(得分:0)
最佳案例复杂性:O(substring.length) 最佳案例:在电源串开始时找到子串
最坏情况复杂性:O(mainstring.length) 最坏情况:在main.length-sub.length找到子字符串
答案 1 :(得分:0)
首先,您当前的解决方案实际上并未使用您提供的示例运行:base
很快就会变为负数。
其次,最糟糕的情况是(substring.length * mainstring.length),因为每次找到不匹配的char时,你必须回溯多个位置,直到子串长度。
例如:
char[] main = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".toCharArray(); //60 A's
char[] sub = "aaaaaaaaaaaaaaaB".toCharArray(); //15 A's
isSubstring(main,sub); //compares each 'a' in main up to 15 times