【问题标题】:Minimum Character that needed to be deleted需要删除的最小字符
【发布时间】:2016-06-10 04:43:45
【问题描述】:

原问题:

如果单词中的每两个字母,如果第一个出现x 次,第二个出现y 次,则一个单词是K-good,那么|x - y| ≤ K.

给定一个单词 w,他需要删除多少个字母才能使其成为 K-good?
Problem Link.

我已经解决了上述问题,我没有要求解决上述问题 问题

我只是第一次看错了这个陈述,只是想我们如何在线性行时间内解决这个问题,这只是产生了一个新问题



修改问题

如果单词中每两个连续的字母,如果第一个出现x 次,第二个出现y 次,则一个单词是K-good,那么|x - y| ≤ K.

给定一个单词 w,他需要删除多少个字母才能使它成为 K-good?

这个问题是否可以在线性时间内解决,我想过但找不到任何有效的解决方案。

解决方案

我的方法:我无法接近我喜欢的人,但她是我解决这个问题的方法,尝试一切(来自电影 Zoopopia)


for i range(0,1<<n):   // n length of string
    for j in range(0,n):
          if(i&(1<<j) is not zero): delete the character
   Now check if String is K good 

对于N10^5 范围内。时间复杂度:该维度中不存在时间。

这个问题有没有线性解决方案,像stackoverflow的人一样简单甜美。

For Ex:
String S = AABCBBCB and K=1


   If we delete 'B' at index 5 so String S = AABCBCB which is good string
    F[A]-F[A]=0
    F[B]-F[A]=1
    F[C]-F[B]=1
    and so on

我想这是一个简单的例子,还有更复杂的例子,比如删除一个 I 元素使 (I-1) 和 (I+1) 成为连续的

【问题讨论】:

  • 你能举个例子来说明你修改后的问题吗?
  • 你能接受复杂度 = O(n^2) 的解决方案吗?

标签: string algorithm


【解决方案1】:

这个问题有线性解决方案吗?

考虑一下DDDAAABBDC这个词。这个词是 3-good,因为DC是连续的和card(D)-card(C)=3,删除最后一个D通过使DCnon-consecutive 使其成为1-good。

相反,如果我认为 DABABABBDC 是 2-good,删除最后一个Dmakes CandBconsecutive 并将单词的 K 值增加到 3。

这意味着在修改后的问题中,一个单词的 K 值是由每个字母的基数和每对连续字母的基数共同决定的。

通过删除一个字母,我减少了它的基数以及它所属的对的基数,但我也增加了其他对的基数(可能会创建新的)。

同样重要的是要注意,如果在原始问题中,所有字母都是等价的(我可以无所谓地删除任何字母),而在修改后的问题中不再是这种情况。

作为结论,我认为我们可以有把握地假设“连续字母”约束使得问题在任何字母/单词的线性时间内都无法解决。

【讨论】:

  • 虽然这不是一个真正的答案,但我认为你是对的。我一直在思考这个问题,除了带有一些小修剪的蛮力算法之外,我真的看不到这个问题的优雅或有效的答案。
  • 我不得不承认我并没有寻找解决问题的最佳方法,而是试图回答“这个问题有没有线性解决方案”部分。即使那样,我的回答也不是正式的证明(因为我可能不得不引入一些定义),但我认为它仍然有效,因为你可以证明你不能以相同的复杂性迭代算法的“部分”比在原始问题中(通常是因为它们由于连续约束而交织在一起)。
【解决方案2】:

而不是找到线性时间解决方案,我认为它不存在(除其他外,因为每个 K 请求似乎有多种替代解决方案) ,我想预设完全怪异的解决方案。

即采用并行数组处理语言@​​987654321@,创建这两个微小的动态函数:

good←{1≥⍴⍵:¯1 ⋄ b←(⌈/a←(∪⍵)⍳⍵)⍴0 ⋄ b[a]+←1 ⋄ ⌈/|2-/b[a]}

make←{⍵,(good ⍵),a,⍺,(l-⍴a←⊃b),⍴b←(⍺=good¨b/¨⊂⍵)⌿(b←↓⍉~(l⍴2)⊤0,⍳2⊥(l←⍴⍵)⍴1)/¨⊂⍵}

good 告诉我们字符串的 K-goodness。下面举几个例子:

// fn" means the fn executes on each of the right args
good" 'AABCBBCB' 'DDDAAABBDC' 'DDDAAABBC' 'DABABABBDC' 'DABABABBC' 'STACKOVERFLOW'
2 3 1 2 3 1

ma​​ke 作为参数

[desired K] make [any string]

然后返回
- 原始字符串
- K 表示原始字符串
- 减少所需 K 的字符串
- 删除了多少字符以实现所需的 K
- 有多少可能的解决方案来实现所需的 K

例如:

3 make 'DABABABBDC'
┌──────────┬─┬─────────┬─┬─┬──┐
│DABABABBDC│2│DABABABBC│3│1│46│
└──────────┴─┴─────────┴─┴─┴──┘

再长一点的字符串:

 1 make 'ABCACDAAFABBC'
┌─────────────┬─┬────────┬─┬─┬────┐
│ABCACDAAFABBC│4│ABCACDFB│1│5│3031│
└─────────────┴─┴────────┴─┴─┴────┘

既可以增加也可以减少 K-goodness。

不幸的是,这是蛮力。我们生成 2^[字符串长度] 和 1 之间所有整数的 2-base,例如:

0 1 0 1 1

然后我们测试子串的好坏,例如:

0 1 0 1 1 / 'STACK'  // Substring is now 'TCK'

我们只选择与所需 K-good 匹配的那些结果(子字符串)。最后,在众多可能的结果中,我们选择了第一个,也就是剩下的字符最多的那个。

至少编写代码很有趣:-)。

【讨论】:

  • 在整个世界并行处理之前,您不会休息,对吗? :-P
  • 呵呵。难道你看不到我只是在为下一个大开发阶段收集力量......并且在开始时遇到了麻烦:-)。但我很快就会截断自己:-)。
猜你喜欢
  • 2020-08-10
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 2019-12-17
相关资源
最近更新 更多