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 ++合并重叠字符串的主要内容,如果未能解决你的问题,请参考以下文章