【问题标题】:Maximise the difference in the number of occurrences of the most and the least frequent letter in the fragment of a string最大化字符串片段中出现频率最高和最不频繁的字母出现次数的差异
【发布时间】:2013-11-08 08:19:45
【问题描述】:

这是来自 spoj 的question

给出一个由 N 个英文字母('a'-'z')的小写字母组成的单词。我们希望选择单词的一个非空连续(即单片)片段,以使片段中出现频率最高和最不频繁的字母的出现次数差异最大化。我们假设最不频繁的字母必须在结果片段中至少出现一次。特别是,如果片段只包含一个字母,那么其中出现频率最高的字母和频率最低的字母就会重合。

例子:

输入

  • 10
  • aabbaaabab

输出

  • 3

如果只有两个字母(比如 a 和 b),我有一个方法
1) 计数器初始化为零。
2) 现在从左到右遍历字符串,每次出现a 递增计数器,每次出现b 递减计数器。
3) 计数器的最大值和最小值的绝对差值给出解。

现在我可以通过检查每一对 ab 来扩展这种方法,这使我的算法运行时间为 26 * 26 * length of string。我应该注意我得到一个子字符串只有一个字符的情况。但是这种运行对于当前的问题是不够的。如何优化我的算法或有更好的算法?

【问题讨论】:

  • 我不明白你的方法如何适用于 2 个字母。例如。它对字符串baaaabaaaab 有什么作用? (子串aaaabaaaa的答案是7)
  • @Rob 最小值为 -1,最大值为 6
  • 为什么不是最大7(8-1)? IE。省略第一个和最后一个字符?还是你的片段必须是字符串的前缀?
  • 最大值为 7。我仍然得到相同的子字符串。最大值(=6)出现在第 10 个字符,最小值(=-1)出现在第 2 个字符。所需的字符串介于最大值和最小值之间。

标签: algorithm


【解决方案1】:

一个小的优化是在一次遍历字符串期间跟踪所有 26*26 计数器(每对字母 1 个)。

这样做的好处是,当你读取字符时,只需要更新对应字母的对即可。

换句话说,您正在更新 26*2 计数器而不是 26*26,因此运行时间更像是 2 * 26 * 字符串长度。

另一个可能的优化是,如果 a

总的来说,我希望这两项更改可以将您的运行时间减少大约 26 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多