【问题标题】:Count number of different characters between two strings of equal length计算两个相等长度的字符串之间的不同字符数
【发布时间】:2020-07-19 10:32:21
【问题描述】:

我有两个长度相等的字符串。每个字符串都包含数字“1”到“9”。

我想计算两个字符串之间该索引处的字符相同的索引数。

例子:

A = "1322113" and
B = "2312213" 

那么输出应该是 4,因为第 1、3、5 和 6 个索引处的字符是相同的(考虑到基于 0 的索引)。

我知道迭代和检查 {O(n)} 的简单解决方案。有没有什么库或技术可以给我更好的时间复杂度?

【问题讨论】:

  • 请向我们展示您目前拥有的东西。
  • 量子计算机对数组查找有更好的复杂性,也许它们可以在这里提供帮助。否则,在普通字符串所在的非索引容器中,没有运气。

标签: c++ string algorithm performance optimization


【解决方案1】:

您无法获得比输入大小更好的复杂性,在本例中为 N 个字符。由于您需要检查所有 N 个字符(因为它们中的每一个都可能是一个潜在的解决方案),所以检查所有这些字符的线性 O(N) 解决方案已经是最佳的了。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    最佳解决方案是 O(n),因为在任何情况下,您都必须遍历这两个字符串才能对相应字符应用操作或检查对字符串应用操作的结果。

    至于任务的具体解决方案我可以建议使用标准算法std::inner_;product

    例如

    #include <iostream>
    #include <string>
    #include <functional>
    #include <iterator>
    #include <numeric>
    
    int main() 
    {
        std::string s1 = "1322113";
        std::string s2 = "2312213";
    
        auto n = std::inner_product( std::begin( s1 ), std::end( s1 ),
                                     std::begin( s2 ),
                                     size_t( 0 ),
                                     std::plus<>(),
                                     std::equal_to<>() );
    
        std::cout << "n = " << n << '\n';
    
        return 0;
    }
    

    程序输出是

    n = 4
    

    如果要计算相同位置的不相等字符的数量,请使用 std::not_equal_to 代替函数对象 std::not_equal_to

    【讨论】:

      【解决方案3】:

      如果你想得到更好的结果,那么你应该考虑不同的字符串存储方法。我看到的第一个优化是将字符串保留为数字。然后你可以迭代这些数字,并比较它们(如果数字很小,你可以使用预先计算的结果表)。这种方法的好处是太模糊了(O(N) 复杂度会变成 (O(N / constant) ~ O(N))。但是出于教育目的你可以尝试改进算法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-08
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 2023-01-07
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        相关资源
        最近更新 更多