python - 提高从已排序字符串中获取字母顺序的顺序复杂度

标签 python c++ algorithm

假设我有一个按字典顺序排序的字符串(最大大小为 m)的列表(大小为 n),由 a-z 组成,但不是 a、b、c 的词汇顺序。 ..。现在的主要问题是我想找到字母表的顺序。所以我把问题分成两部分:

  1. 从列表中的字符串中找到有序的字母对。
  2. 从这些对作为边构造一个有向图。对图进行拓扑排序以获得顺序。

我的问题是关于第一个。

为了做 1.,我做了一个 O(n^2m) 循环:

vector<pair<char, char> > build_ordered_pairs(vector<string> words) {
    vector<pair<char, char> > ordered_pairs;
    for(int i=0;i<n;i++) {
        for(int j=i+1;j<n;j++) {
            k = 0;
            while(k < words[i].size() && k < words[j].size() && words[i][k] == words[j][k])
                k++;
            if(k < words[i].size() && k < words[j].size())
                ordered_pairs.push_back(make_pair(words[i][k], words[j][k]));
        }
    }
    return ordered_pairs;
}

为了改进这一点,我们可以将字符串放在 trie 中,然后从 trie 的每个级别获取对。但这又是 n 的二次方。我们可以做得更好吗,比如 nlogn 或 n?

我们可能会一次又一次地得到相同的双鞋。那么我们是否可以检查不需要某个对,因此我们可以在同时构建有向图时跳过它。提前致谢。

示例输入输出对:

words = {"baa", "abcd", "abca", "cab", "cad"}
required = {'b', 'd', 'a', 'c'}

P.S:也标记为 python,因为两者的解决方案/建议都对我有用。

最佳答案

您检查的字符串对比您需要的多得多。您只需要检查连续的字符串对,而不是所有对。通过比较字符串 0 和 3 获得的信息由 0-1、1-2 和 2-3 比较隐含,拓扑排序可以为您处理。拓扑排序应该运行更快并且输入中的无关边缘也更少。

关于python - 提高从已排序字符串中获取字母顺序的顺序复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52489854/

相关文章:

python - 写入文本文件 - 'ascii' 编解码器无法对字符进行编码

python - 创建注销用户可访问的 Graphite 烯突变 (Django)

c++ - 在类型删除的小对象优化中调试崩溃

c++ - 使用对象生命周期运行线程

c++ - 需要有关在 gcc-7.2.0 中有编译错误但在 gcc-6.4.0 中没有的代码的帮助

python - Pip 安装 - 下载的 whl 文件会保留并占用磁盘空间吗?

python - 如何使用 Python 将嵌套函数调用重构为代码行?

c# - Rabin Karp字符串匹配算法

algorithm - 威尔逊分数区间可能的结果范围

java - 将两个数组合并为一个