【发布时间】:2019-02-28 14:04:23
【问题描述】:
假设我有一个按字典顺序排序的字符串列表(大小为 n),由 a-z 组成,但不是 a, b, c... 的词汇顺序。现在主要问题是我想找到字母表的顺序。所以我把问题分为两部分:
- 从列表中的字符串中查找有序的字母对。
- 将这些对作为边构建有向图。对图进行拓扑排序以获得顺序。
我的问题是关于第一个。
为了做 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,因为两者中的解决方案/建议都对我有用。
【问题讨论】:
-
@blhsing,使用示例输入输出对进行编辑。谢谢。