C++ 字符串的词法排名

2024 年 8 月 29 日 | 5 分钟阅读

在本文中,我们将讨论 C++ 中字符串的字典序排名。但在深入实现之前,我们必须了解什么是字典序。

字典序字典顺序(通常称为字母或字典排列)是根据每个组成字母的字母顺序排列单词的方式。

问题陈述

查找字符串 str 在其所有修改(按字典序排序时)中的排名。

示例

解释:如果给定字符串的所有排列都按字典序组织,它们将看起来像 "abc", "acb", "bac", "bca", "cab""cba"。由此可见,字符串的排名是 5。

朴素的方法是按字典序生成所有排列,并保存当前字符串的排名。检查生成的排列是否与输入字符串匹配,并返回字符串的排名。

算法

文件名:StringOrder.cpp

输出

2617

使用排列概念计算字符串的字典序排名

该问题可以使用排列概念解决,该概念基于以下思想:

确定当所有字符固定到该索引时,可以创建多少个字典序较小的字符串。它将返回比该字符串小的字符串,我们将能够确定排名。

要将此概念付诸实践,请执行以下操作:

  • i = 0 到字符串的长度遍历字符串
  • 确定小于当前字符的字符数量。
  • 计算字典序较小的字符串数量。
  • 将该值添加到排名中。
  • 最后,将排名乘以 1,并将结果作为所需答案返回。

文件名:StringOrder2.cpp

输出

2617

字符串的线性时间字典序排名

该解决方案的逻辑与上述技术相同。通过建立一个大小为 256 的辅助数组,可以减少时间复杂度。让我们创建一个数组,存储字符串中小于 第 i 个字符 的字符总数,并在字符串迭代期间,在给定字符串的每个索引之后更新它。

文件名:StringRank.cpp

输出

The rank of the string is 2617

复杂度

时间复杂度:O(N)

空间复杂度:O(1)