不确定此代码的时间复杂性

时间:2018-01-22 16:53:18

标签: java string algorithm

我最近解决了https://www.geeksforgeeks.org/find-given-string-can-represented-substring-iterating-substring-n-times/

上提出的问题

问题是通过迭代子字符串n次来确定是否可以从子字符串表示特定字符​​串。

例如,字符串"abcabcabc"可以通过迭代子字符串"abc"来表示。

我提出了这个Java解决方案

public static boolean canForm (String str) {

    if(str.isEmpty()||str.length()==1) return true;

    int end;

    if (str.length()%2==0) {
        end = str.length()/2;
    } else {
        end = (str.length()-1)/2;
    }

    for (int i=1; i<=end; i++) {
        String s = str.substring(0,i);
        String compare = "";
        while (compare.length()<str.length()) {
         compare += s;
        }
        if (compare.equals(str)) return true;
    }

    return false;
}

问题的一个条件是解决方案是O(n)。我得出的结论是O(n),但我不确定我的解决方案是否真的是O(n),或者实际上是O(n ^ 2)以及为什么。

1 个答案:

答案 0 :(得分:0)

你的程序在O(n ^ 2)中运行,其中n与字符串的长度成比例。您的代码有一个while循环,它在一个迭代n次的for循环中迭代n次。 因此,程序的顺序是O(n * n)= O(n ^ 2)。