我正在编写一个c程序来查找两个字符串中常见字符的数量。
例如:aabbccc aabc答案:4
aabcA aa Ans:2
(字符串将包含大写,小写和数字)
我脑子里有两种算法
假设字符串的长度为n,m
1.排序数组,然后计算O(nlogn + mlogm)复杂度
2.scan通过两个字符串并使用计数数组 - O(n + m)复杂度
有人可以建议进一步优化或任何其他方法来做到这一点吗?
答案 0 :(得分:1)
基本上你问的是 Bag(Multiset)交叉点。
我想没有比O(n + m)更有效的算法因为你必须至少经历一次两个袋子的每一个元素。
答案 1 :(得分:0)
因为大输入需要优化,我认为你的第二种方法非常好(计算数组方法)。无论您尝试找出哪种算法,如果不完全查看这两个字符串,就无法找到问题的答案。因此,该问题不应该进一步优化,因为它已经是O(m + n)。我认为对于较小的输入,您的第一个算法将更快地工作,因为与您的第二个算法相关联的O(26 + 26 + 10)常数。但如果您真的对更快的代码感兴趣,那么尝试优化读取和写入输出的方法。您可以谷歌搜索“C ++中更快的I / O”并阅读它。