需要删除的最小字符数

时间:2016-05-30 09:11:31

标签: string algorithm

原始问题:

如果单词中的每两个字母,如果第一个出现x次,第二个出现y次,则为{K-good},那么|x - y| ≤ K. <登记/>

考虑到一些单词w,他必须删除多少个字母才能使其成为K-good?
Problem Link

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

我只是第一次误读了这句话,我想我们怎样才能在线性时间内解决这个问题,这只会引发一个新问题



修改问题

如果单词中的每个两个连续字母,如果第一个出现x次,第二个出现y次,那么{K}就是K-good,那么{{ 1}}

考虑到一些单词w,他必须移除多少个字母以使其成为K-good?

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

解决方案

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

即。

|x - y| ≤ K.

对于范围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 中的N。时间复杂性:该维度中不存在时间。

这个问题是否有线性解决方案,像stackoverflow的人一样简单而甜蜜。

10^5

我想这是一个简单的例子,我可以将更复杂的例子删除为I元素makens(I-1)和(I + 1)连续

2 个答案:

答案 0 :(得分:2)

  

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

考虑单词DDDAAABBDC。这个词是3-good,因为DC是连续的card(D)-card(C)=3,删除最后的D会使D成为1-good C非连续的。

反过来,如果我认为DABABABBDC是2-good,则删除最后D会使CB连续,并将该字的K值增加到3

这意味着在修改后的问题中,单词的K值由每个字母的红衣主教和每对连续字母的红衣主教决定。

通过删除一封信,我减少了它的基数以及它所属的对的红衣主教,但我也增加了其他对的基数(可能会创建新的)。

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

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

答案 1 :(得分:1)

相反 找到线性时间解决方案,我认为不存在(其中因为每个K请求似乎有多种替代解决方案) ,我想预设完全令人讨厌的解决方案。

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

if blah < 80 {
    if let newAlertView = newAlert as? UIAlertController {
       newAlertView.dismissViewControllerAnimated(true, completion: nil)
    }
}

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

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)/¨⊂⍵}

制作作为参数

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

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

例如:

[desired K] make [any string]

稍长一点的字符串:

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

可以增加和减少K-良好。

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

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

然后我们测试子串的优点,例如:

0 1 0 1 1

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

至少这对代码来说很有趣: - )。