【问题标题】:Find Kth lexographically smallest string查找第 K 个字典序最小的字符串
【发布时间】:2014-08-27 15:54:45
【问题描述】:

给定 N A's 和 N B's 如何在所有长度为 2*N 的字符串中找到第 K 个按字典顺序最小的字符串。

就像如果 N=2 这意味着我们有 2A 和 2B 那么如果我们需要找到说 2(=K) 最小的字典最小字符串,那么答案是“ABBA”。

解释:

0.AABB
1.ABAB
2.ABBA
3.BAAB
4.BABA
5.BBAA

一种方法是简单地找到所有字符串并对它们进行排序,然后找到第 k 个最小的字符串。但是他们是更好的方法吗?

【问题讨论】:

  • 为什么选择 ABBA 而不是 AABB?
  • @DavidEisenstat 我认为它有点不同。
  • @BlackBear 查看说明
  • 阅读并思考一分钟以上并没有什么不同。

标签: algorithm


【解决方案1】:

首先让我们从左边开始。你有 N A 和 N B。 首先计算以 A 作为第一个字符的字符串的数量。这是 (2n-1)!/((n-1)!(n)!) 如果这个值大于 K,那么我们的字符串将以 K 开头,否则将以 B 开头。现在,继续我们有两种情况

Case1:如果以A开头,那么下一步要检查的A的数量将减少1。我们将检查(2n-2)!/((n-2)!(n!))K的值不需要更新。

案例2:如果以B开头,那么下一步要签入的B的数量将减少1。我们将检查(2n-2)!/((n-1)!(n-1)!)1的值将更新为K - (2n-1)!/((n-1)!(n)!),我们继续新的价值观。

复杂性问题:我们不需要每次都重新计算阶乘。由于我们看到分子中的阶乘一直在减少,我们可以将其除以(2n - stepNo) 并获得下一步的分子。对于任何一个分母也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2020-07-20
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多