以下是查找字符串的所有子字符串的解决方案。
for (int i = 0; i < str.length(); i++) {
String subStr;
for (int j = i; j < str.length(); j++) {
subStr = str + str.charAt(j));
System.out.println(subStr);
}
}
在互联网上我读到这段代码的复杂性是O(n 2 )。 但是+操作是O(n)操作。 因此,在我看来,复杂性应该是O(n 3 )。
如果我错了,请纠正我的理解。
答案 0 :(得分:1)
查找字符串的所有子字符串是O(n 2 )(通过查找子字符串我的意思是确定其开始和结束索引),很容易看到,因为子字符串的总数是O( ñ 2 )。
但是将所有这些打印出来都是O(n 3 ),因为要打印的字符总数是O(n 3 )。在您的代码中,println
会增加O(n)复杂度(如果正确使用/实现,+
运算符应具有O(1)复杂度。)
答案 1 :(得分:0)
向字符串添加字符是O(1)操作。如果您考虑使用println
打印输出所需的时间,则可以使用 3 。
答案 2 :(得分:0)
从字符串中查找所有子字符串的天真方式确实是O(n ^ 2)。但问题中的代码可能不会这样做。这是更正后的版本。
for (int i = 0; i < str.length(); ++i) {
//Initialize with max length of the substring
StringBuilder prefix = new StringBuilder(str.length() - i);
for (int j = i; j < str.length(); ++j) {
prefix.append(str.charAt(j)); //this step is O(1).
System.out.println(prefix); //this step is supposed to be O(1)
}
}
The total number of iterations is given by
Outer Loop : Inner Loop
First time : n
Second time : n - 1
Third Time : n - 2
..
n - 2 time : 2
n - 1 time : 1
So the total number of iterations is sum of iterations of outer loop plus sum of iterations of the inner loop.
n + (1 + 2 + 3 + ... + n - 3 + n - 2 + n - 1 + n) is = O(n^2)