如何检查两个字符串是否有任何公共部分

How to check if two strings have any common part?

本文关键字:是否 公共部 字符串 任何 何检查 检查 两个      更新时间:2023-10-16

如何检查两个字符串在 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;
}

输出:

阿特曼

相关文章: