我试图通过破解关于压缩字符串的代码采访书来做一个练习:
使用计数实现一个方法来执行基本的字符串压缩 重复的人物。例如,字符串aabcccccaaa将成为 a2blc5a3。如果“压缩”字符串不会小于原始字符串 string,你的方法应该返回原始字符串。
作者提出的第一个主张如下:
public static String compressBad(String str) {
int size = countCompression(str);
if (size >= str.length()) {
return str;
}
String mystr = "";
char last = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) == last) {
count++;
} else {
mystr += last + "" + count;
last = str.charAt(i);
count = 1;
}
}
return mystr + last + count;
}
关于算法的时间复杂度,她说:
运行时为0(p + k ^ 2),其中p是原始字符串的大小,k是字符序列的数量。例如,如果字符串是aabccdeeaa,则有六个字符序列。它很慢,因为字符串连接在0(n ^ 2)时间内运行
我有两个主要问题:
1)为什么时间复杂度为O(p + k ^ 2),它应该只有O(p)(其中p是字符串的大小)没有?因为我们只进行p次迭代而不是p + k ^ 2.
2)为什么字符串连接的时间复杂度为0(n ^ 2)??? 我认为如果我们有一个string3 = string1 + string2,那么我们有一个复杂的大小(string1)+ size(string2),因为我们必须创建两个字符串的副本,然后再将它们添加到一个新的字符串(创建一个字符串)是O(1))。那么,我们将增加一个不是乘法,不是吗?对于数组来说不是一回事(例如我们使用了char数组)?
你能澄清这些要点吗?我不明白我们如何计算复杂性...
答案 0 :(得分:0)
字符串连接是O(n)但在这种情况下它连接K次。 每次找到序列时,都必须复制整个字符串+找到的内容。例如,如果原始字符串中有四个总序列 获得最终字符串的成本将是:
(k-3)+ //first sequence
(k-3)+(k-2) + //copying previous string and adding new sequence
((k-3)+(+k-2)+k(-1) + //copying previous string and adding new sequence
((k-3)+(k-2)+(k-1)+k) //copying previous string and adding new sequence
因此复杂性为O(p + K ^ 2)