原始问题:
如果单词中的每两个字母,如果第一个出现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)连续
答案 0 :(得分:2)
这个问题有线性解决方案吗?
考虑单词DDDAAABBDC
。这个词是3-good,因为D
和C
是连续的card(D)-card(C)=3
,删除最后的D
会使D
成为1-good C
非连续的。
反过来,如果我认为DABABABBDC
是2-good,则删除最后D
会使C
和B
连续,并将该字的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相匹配的结果(子串)。最后,在众多可能的结果中,我们选择第一个,即剩下大多数字符的那个。
至少这对代码来说很有趣: - )。