下面算法的复杂度顺序是什么,以找到给定字符串的子串

时间:2014-09-12 20:36:03

标签: java string algorithm big-o

我写了下面的代码,用于查找给定的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);

    }

}

2 个答案:

答案 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