有效地从字符串中删除单字母子字符串



所以我已经尝试解决这个问题一段时间了,但不知道如何有效地解决这个问题。

我得到了一个由N(N>=3(个字符组成的子字符串,该子字符串仅包含字符"a"one_answers"B"。我必须有效地找到一种方法来计算所有可能的子字符串,这些子字符串只有一个a或一个B,具有相同的顺序。

例如ABABA:对于三个字母,子字符串为:ABA、BAB、ABA。对于这三个计数,因为这三个都只包含一个B或一个A。对于四个字母,子字符串将是:ABAB,BABA。这些都不算,因为它们都没有一个A或B。五个字母:ABABA。这不算,因为它不是只有一个A或B。如果字符串较大,则会检查所有子字符串组合。

我需要实现这是O(n^2(甚至O(nlogn(时间,但我能做的最好的是O(n ^3(时间,其中我从3循环到子字符串长度的字符串长度,使用嵌套的for循环来检查每个子字符串,然后使用indexOf和lastIndexOf,并查看每个子字符串是否匹配且不等于-1(意味着只有1个字符(,对于a和B。

如何实现O(n^2(或O(nlogn(时间有什么想法吗?谢谢

从字符串中有效删除单字母子字符串

这是完全不可能的。删除一个字母已经是O(n(时间了。正确的答案是不要在任何地方删除任何内容。你不需要。

实际的答案是停止删除字母和生成子字符串。如果你打电话给substring,你就搞砸了。

如何实现O(n^2(或O(nlogn(时间有什么想法吗?谢谢

我一无所知。看起来也有点傻。但是,有一些好消息:有一种O(n)算法可用,为什么要用毫无意义的低效算法呢?

CCD_ 3是有效的。我们可以使用它。

这是你的伪代码算法,因为如果我只是为你写,你不会学到太多:

首先进行设置。有点复杂:

  • 维护计数器A和B发生的次数
  • 保持当前子字符串的起始位置。很明显,它从0开始
  • 通过从0循环到x(x=子字符串长度(开始程序,并更新A/B计数器。因此,如果x为3,输入为ABABA,则需要以aCount = 2bCount = 1结束

准备工作完成后,让我们运行算法:

  • 检查当前子字符串(即从0开始的子字符串(是否"有效">您根本不需要运行substring或进行任何字符串操作就可以知道这一点。只需检查您的aCount和bCount变量即可。其中一个正是1吗?然后这个子字符串就工作了。如果没有,就没有。如果有效,请将您的答案计数器增加1,如果无效,请不要这样做
  • 接下来,移动到下一个子字符串。要计算此值,请首先获取当前位置(0(处的角色。然后aCountbCount减去1,具体取决于其中的内容。然后,获取"末尾"的字符(.charAt(pos + x)(,并根据存在的内容将1添加到aCount或bCount。您的aCountbCount变量现在分别表示从位置1开始的子字符串中有多少As和Bs。更新这些变量只需要两个恒定的步骤
  • 。。。和循环。保持循环,直到结束(pos + x(位于字符串的末尾

这是O(n):假设输入字符串为1000个字符,子字符串检查为10,则设置成本为10,中央循环成本为990个循环。CCD_ 17到点。.charAt就是O(1),每个循环需要两个。常数不会改变大O数。

相关内容

最新更新