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

Java 不确定此代码的时间复杂性,java,string,algorithm,Java,String,Algorithm,我最近解决了一个问题 问题在于通过将子字符串迭代n次来确定是否可以从子字符串中表示特定字符串 例如,字符串“abcabc”可以通过迭代子字符串“abc”3来表示 我提出了这个Java解决方案 public static boolean canForm (String str) { if(str.isEmpty()||str.length()==1) return true; int end; if (str.length()%2==0) { end

我最近解决了一个问题

问题在于通过将子字符串迭代n次来确定是否可以从子字符串中表示特定字符串

例如,字符串
“abcabc”
可以通过迭代子字符串
“abc”
3来表示

我提出了这个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;
}
publicstaticbooleancanform(stringstr){
if(str.isEmpty()| | str.length()==1)返回true;
内端;
如果(str.length()%2==0){
end=str.length()/2;
}否则{
end=(str.length()-1)/2;
}
for(int i=1;i您的程序在O(n^2)中运行,其中n与字符串的长度成比例。您的代码有一个while循环,该循环在一个for循环中迭代n次。

因此,程序的顺序是O(n*n)=O(n^2)。

如果您能解释如何得出它的O(n),那么如果您弄错了,最好纠正您的错误,而不是完全回答问题。对于每次迭代,字符串变量“compare”部分由大小为str.substring(0,i)的子字符串构成。例如字符串“abcd”将需要4+2=6个步骤来构造。如果我们将字符串的大小加倍为“abcdefghi”,它将是8+4+3+2个步骤。因此,总步骤数将是一些常数乘以n减去另一个常数,例如c*n-k。因此时间复杂度将是O(n)。我想知道这种想法是否有缺陷,以便可以纠正,并防止我将来犯这种错误。请注意,
for(…){…str.substring(…)}
单独运行(…){…str.substring(…)}
已经产生了
O(n^2)
,因为
substring
O(n)中运行
。因此,请参见。级联
compare+=s
compare.equals(str)
也是如此。所有这些子表达式都在
O(n)
中运行,并与
的包装
循环一起产生
O(n^2)
。这不是答案,但您可以先检查
i
是否是
str.length
的除数,这是我想到的想法。我还想到了另一种解决方案,包括旋转字符串并将旋转后的字符串与原始字符串进行比较。如果它们相同,则可以重新表示字符串子字符串n次重复。我还想到了一个Python解决方案,它利用了可用于字符串的multiplicaton运算符。我只是想确定我发布的用于学习的解决方案的时间复杂性。您可以通过向分析中添加非平凡的方法调用来改进,如
substring
和concatenation
compare+=2
。这就是我感到困惑的地方。我知道它会在第一次迭代中迭代n次,但每次迭代的迭代次数都会减少。所以“abcdefghi”将是n+n/2+3+n/4。它不会在每次迭代中迭代n次。它会在第一次迭代中迭代n次,然后再迭代n次/(一些常数)用于每次迭代。这就是我感到困惑的原因。@CoderInLearning你应该知道O(an),其中a是常数,与O(n)相同。@cdaiga我知道大O的基本原理。正如O(n^2+n+1)将是O(n^2)或O(48n^3+6n^2+1)将是O(n^3)。谢谢你的帮助,因为总和中的每个术语都是O(n)。无论是n/2还是n/4,每个项的计算结果都是O(n)。经过n次计算,它的计算结果都是O(n^2)。因此,它实际上会计算为O(n^2)。