C ++合并重叠字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++合并重叠字符串相关的知识,希望对你有一定的参考价值。

假设我有字符串A:“ info_mesh”,我想将其添加为字符串B:“ mesh_foo”。

但是,我想要字符串“ info_mesh_foo”,而不是字符串“ info_meshmesh_foo”。

我不能只说:

std::string A = "randomstuffoverlap", B = "overlapwithmorestuff"
std::string C = A + B;

因为我最终会得到:

C = "randomstuffoverlapoverlapwithmorestuff",

当我想要时:

C = "randomstuffoverlapwithmorestuff"

没有两次提到的“重叠”,就好像所创建的字符串具有两个字符串的“网格”。

但是,如果满足以下条件,我也希望它能正常工作:

std::string A = "juststuff", B = "unrelatedstuff", C;
//std::string C should be made equal to "juststuffunrelatedstuff".

(因此它们之间没有共享的子字符串)

我将如何去做?预先感谢。

答案

尝试一下;

std::string A = "randomstuffoverlap", B = "overlapwithmorestuff", C;
size_t pos = A.find_last_of(B[0]);
if (pos != std::string::npos)

    std::string::difference_type d = A.size() - pos;
    if (A.substr(pos) == B.substr(0, d))
        C = A + B.substr(d);
    else
        C = A + B;

else
    C = A + B;
std::cout << C << std::endl;
另一答案

嗯,从最大可能值(完全重叠)开始,向下循环直到适合为止,然后从重叠的位置返回结果:

std::string overlap(std::string_view a, std::string_view b) 
    for (auto n = std::min(a.size(), b.size());; --n) 
        if (b.endswith(a.substr(0, n))) // b.substr(b.size() - n) == a.substr(0, n)
            return std::string(b) + a.substr(n);
        else if (a.endswith(b.substr(0, n))) // a.substr(a.size() - n) == b.substr(0, n)
            return std::string(a) + b.substr(n);

如果无法使用C++20 std::string_view::endswith(),请在注释中使用替代项。

另一答案

这花了我一段时间,但我有此功能:

std::string_view::endswith()

如果希望限制共享字符,也可以表示为:

string overlapjoin(string a, string b) 
    for (long long x = (b.length()<= a.length())? b.length(): a.length(); x > 0; --x)
        if (a.substr(a.length() - x, a.length() - 1) == b.substr(0, x))
            return(a.substr(0, a.length() - x) + b);
    return(a + b);

以上是关于C ++合并重叠字符串的主要内容,如果未能解决你的问题,请参考以下文章

精选力扣500题 第45题 LeetCode 56. 合并区间c++/java详细题解

按元素名称组合/合并列表

合并区间(NC37/考察次数Top57/难度中等)

合并区间(NC37/考察次数Top57/难度中等)

c语言基础问题 如何合并字符

【An教程】快速入门Animate(原Adobe Flash)