如何检查两个字符串是否有任何公共部分
How to check if two strings have any common part?
如何检查两个字符串在 c++ 中是否有任何公共部分(子字符串(。
我想对字符串进行排序,然后在两个字符串上使用循环来检查它们是否有公共部分。但我不确定。而且我也认为这不是这个问题的最佳策略
考虑字符串 - "蝙蝠侠"和"猫人"他们有一个共同的部分"阿特曼"。
附言我没有检查超过一个字符。例如 - "苹果"和"蝙蝠侠"有一个共同点,但我对子字符串感兴趣(至少两个常见的连续字符(。
这可能不是最有效的代码,但你可以了解它在蝙蝠侠和猫侠的情况下是如何工作的:
注意:这确实解决了其他情况,如"batmanuc"和"catmanic",这将是"atman"。
它既不完美,也不是最有效的,但它可以帮助您了解一种方法以及如何管理数组的位置。从这里开始,以您自己的方式实施它并添加详细信息取决于您!
例如,像if max>2
然后打印数组,如果没有,请不要打印它。
#include <iostream>
using namespace std;
int main()
{
char arr1[10]="batmanuc";
char arr2[10]="catmanic";
char common[10];
int cont=0;
int max=0;
for (int i=0;i<10;i++){
if(arr1[i]==arr2[i]){
if(cont==max){
common[cont]=arr1[i];
cont++;
max++;
}
}
else cont=0;
}
printf("%s",common);
return 0;
}
一个愚蠢的算法 - 对于从最大窗口(等于最大字符串长度(到最小窗口大小(等于 2,问题中所述(的每个窗口大小,对于两个字符串中的每个位置,将每个位置与每个字符串中的每个位置进行比较 window_size。
#include <iostream>
#include <string>
#include <cstring>
#include <cassert>
#include <cstdio>
std::string find_common_part(std::string one, std::string two) {
const auto onesize = one.size();
const auto twosize = two.size();
const auto onebegin = one.begin();
const auto twobegin = two.begin();
// min. two common consecutive characters
for (std::size_t window_size = std::max(onesize, twosize);
window_size >= 2;
--window_size) {
for (auto onepos = onebegin,
oneposmax = onebegin + (onesize - window_size);
onepos <= oneposmax;
++onepos) {
for (auto twopos = twobegin,
twoposmax = twobegin + (twosize - window_size);
twopos <= twoposmax;
++twopos) {
if (std::equal(onepos, onepos + window_size, twopos)) {
return std::string(onepos, onepos + window_size);
}
}
}
}
return std::string();
}
int main()
{
std::cout << find_common_part("catman", "batman") << std::endl;
assert(find_common_part("catman", "batman") == "atman");
assert(find_common_part("batman", "manbat") == "man" ||
find_common_part("batman", "manbat") == "bat");
return 0;
}
此函数将为您提供两个字符串的最长公共子字符串: (可能不是最快的方法(
std::string GetLongestCommonSubstring(std::string const& a, std::string const& b) {
std::vector<std::string> substrings;
for (auto beg = a.begin(); beg != std::prev(a.end()); ++beg)
for (auto end = beg; end != a.end(); ++end)
if (b.find(std::string(beg, std::next(end))) != std::string::npos)
substrings.emplace_back(beg, std::next(end));
return *std::max_element(substrings.begin(), substrings.end(),
[](auto& elem1, auto& elem2) { return elem1.length() < elem2.length(); });
}
例:
int main() { std::cout << GetLongestCommonSubstring("batman", "catman") << std::endl; }
输出:
阿特曼
相关文章:
- 公共/私有/受保护是否会更改内存中结构的排列?
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 如果使用非公共类,vtable 是否会在二进制文件中持续存在?
- 公共变量是否比使用 getter 和 setter 更快?
- 是否可以保证输入<Type>实数时复杂对象的虚部设置为零?
- 是否可以从创建其创建的Main()之外的公共类成员访问公共类成员
- 子类是否也在 c++ 中继承私有数据成员?但通过超类的公共方法访问
- 是否有一种有效的,适当的方法将非常大的公共班级枚举放在利用它们的公共方法之下,以使代码更加干净
- 是否有一种方法可以让公共成员在班级外部无法解码,而无需访问包装器功能
- 是否有希望在std::变体上高效地调用一个公共基类方法
- 如果基类是公开继承的,那么基类的公共静态函数是否会成为派生类的成员函数
- 如何检查两个字符串是否有任何公共部分
- 是否允许访问联合成员的公共基类,而不管存储的类型如何
- 是否必须在内存中"next to each other"两个相邻声明的公共字段?
- 公共和私有对对象的内存布局是否有任何影响
- 查找一个数字是否是其他一些数字的公共倍数
- 具有公共成员而没有构造函数的结构和类之间的编译器是否有区别
- 在独立类中对公共非虚拟方法重新排序是否会破坏 ABI
- 检查子类的构造函数在C++中是否是公共的
- 检查两个字符串c++中是否有一个公共子字符串