【问题标题】:String transformation by performing lowercase to uppercase conversion and lowercase deletion通过执行小写到大写转换和小写删除的字符串转换
【发布时间】: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 有多长并不重要。

标签: c++ string algorithm


【解决方案1】:

最终我自己找到了答案。我相信上面显示的算法是 O(n + m),但它并不能正确解决所有情况。 s1 = "aA", s2 = "AA" 失败的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 2014-03-30
    • 1970-01-01
    • 2011-01-16
    • 2016-01-25
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多