【发布时间】:2013-11-08 08:19:45
【问题描述】:
这是来自 spoj 的question
给出一个由 N 个英文字母('a'-'z')的小写字母组成的单词。我们希望选择单词的一个非空连续(即单片)片段,以使片段中出现频率最高和最不频繁的字母的出现次数差异最大化。我们假设最不频繁的字母必须在结果片段中至少出现一次。特别是,如果片段只包含一个字母,那么其中出现频率最高的字母和频率最低的字母就会重合。
例子:
输入
- 10
- aabbaaabab
输出
- 3
如果只有两个字母(比如 a 和 b),我有一个方法
1) 计数器初始化为零。
2) 现在从左到右遍历字符串,每次出现a 递增计数器,每次出现b 递减计数器。
3) 计数器的最大值和最小值的绝对差值给出解。
现在我可以通过检查每一对 a 和 b 来扩展这种方法,这使我的算法运行时间为 26 * 26 * length of string。我应该注意我得到一个子字符串只有一个字符的情况。但是这种运行对于当前的问题是不够的。如何优化我的算法或有更好的算法?
【问题讨论】:
-
我不明白你的方法如何适用于 2 个字母。例如。它对字符串
baaaabaaaab有什么作用? (子串aaaabaaaa的答案是7) -
@Rob 最小值为 -1,最大值为 6
-
为什么不是最大7(8-1)? IE。省略第一个和最后一个字符?还是你的片段必须是字符串的前缀?
-
最大值为 7。我仍然得到相同的子字符串。最大值(=6)出现在第 10 个字符,最小值(=-1)出现在第 2 个字符。所需的字符串介于最大值和最小值之间。
标签: algorithm