【发布时间】:2021-01-14 14:42:22
【问题描述】:
我正在尝试理解这个算法:https://www.geeksforgeeks.org/check-possible-transform-one-string-another/。我想出了自己的想法来解决这个任务。问题是我认为我的解决方案是 O(n + m) 复杂度,这看起来很奇怪,因为显示的解决方案是 O(nm)
我的代码:
bool check(string s1, string s2) {
int tmp = 0;
for (int i = 0 ; i < s2.length(); ++i) {
int pos = s1.substr(tmp).find(s2[i]);
if (pos == string::npos) {
pos = s1.substr(tmp).find(tolower(s2[i]));
}
if (pos == string::npos) {
return false;
}
pos += tmp;
for (int j = tmp; j < pos; ++j) {
if (isupper(s1[j])) {
return false;
}
}
tmp = pos + 1;
}
return true;
}
我知道 find 方法的复杂度是 O(n*m),但在这种情况下,我只在字符串中寻找单个字符,所以它的复杂度是 O(n)。谁能告诉我我做错了什么?或者只是显示一个我错过的测试用例。
【问题讨论】:
-
循环播放? O(N²).
-
你确定吗,因为我使用子字符串进行迭代,这不是循环情况下的随意循环。
-
我认为 O(N) 解决方案是可能的,您将其视为状态机。
-
这是一个循环中的循环。自动 O(N²) 除非您的内部循环绑定到一个常数。你的不是,它取决于字符串的长度。
-
字符串 s1 中的每个字符在最坏的情况下被迭代 3 次。字符串 s2 有多长并不重要。