legongju.com
我们一直在努力
2025-01-11 10:10 | 星期六

怎样在c++中实现自定义的字符串匹配规则

在 C++ 中实现自定义的字符串匹配规则,你可以使用以下几种方法:

  1. 暴力匹配(Brute Force)

遍历目标字符串,逐个字符与模式字符串进行比较。这种方法的时间复杂度较高,为 O(n*m),其中 n 和 m 分别为目标字符串和模式字符串的长度。

#include 
#include 

bool isMatch(const std::string& target, const std::string& pattern) {
    int n = target.size();
    int m = pattern.size();

    for (int i = 0; i <= n - m; ++i) {
        bool match = true;
        for (int j = 0; j < m; ++j) {
            if (target[i + j] != pattern[j]) {
                match = false;
                break;
            }
        }
        if (match) {
            return true;
        }
    }
    return false;
}

int main() {
    std::string target = "hello";
    std::string pattern = "ll";
    std::cout << (isMatch(target, pattern) ? "匹配成功" : "匹配失败") << std::endl;
    return 0;
}
  1. KMP 算法(Knuth-Morris-Pratt)

KMP 算法是一种高效的字符串匹配算法,时间复杂度为 O(n+m)。它通过预处理模式字符串,避免在不匹配时重新检查已匹配的字符。

#include 
#include 

std::vector computePrefixFunction(const std::string& pattern) {
    int m = pattern.size();
    std::vector pi(m, 0);
    int k = 0;

    for (int q = 1; q < m; ++q) {
        while (k > 0 && pattern[k] != pattern[q]) {
            k = pi[k - 1];
        }
        if (pattern[k] == pattern[q]) {
            ++k;
        }
        pi[q] = k;
    }
    return pi;
}

bool isMatch(const std::string& target, const std::string& pattern) {
    int n = target.size();
    int m = pattern.size();
    std::vector pi = computePrefixFunction(pattern);

    int q = 0;
    for (int i = 0; i < n; ++i) {
        while (q > 0 && pattern[q] != target[i]) {
            q = pi[q - 1];
        }
        if (pattern[q] == target[i]) {
            ++q;
        }
        if (q == m) {
            return true;
        }
    }
    return false;
}

int main() {
    std::string target = "hello";
    std::string pattern = "ll";
    std::cout << (isMatch(target, pattern) ? "匹配成功" : "匹配失败") << std::endl;
    return 0;
}
  1. BM 算法(Boyer-Moore)

BM 算法是一种快速的字符串匹配算法,平均时间复杂度为 O(n+m)。它通过跳过一些不匹配的字符来减少匹配次数。

#include 
#include 

std::string badCharacterTable(const std::string& pattern) {
    int m = pattern.size();
    std::string badCharTable(m, 0);

    for (int i = 0; i < m; ++i) {
        badCharTable[pattern[i]] = i;
    }
    return badCharTable;
}

std::string goodSuffixTable(const std::string& pattern, const std::string& badCharTable) {
    int m = pattern.size();
    std::string goodSuffixTable(m, 0);
    int k = 0;

    for (int i = m - 1; i >= 0; --i) {
        while (k > 0 && pattern[k] != pattern[i]) {
            k = badCharTable[pattern[k]];
        }
        if (pattern[k] == pattern[i]) {
            ++k;
        }
        goodSuffixTable[i] = k;
    }
    return goodSuffixTable;
}

bool isMatch(const std::string& target, const std::string& pattern) {
    int n = target.size();
    int m = pattern.size();
    std::string badCharTable = badCharacterTable(pattern);
    std::string goodSuffixTable = goodSuffixTable(pattern, badCharTable);

    int i = 0;
    int j = 0;
    while (i < n) {
        if (j > 0 && pattern[j] != target[i]) {
            j = goodSuffixTable[j - 1];
        }
        if (pattern[j] == target[i]) {
            ++i;
            ++j;
        } else if (j == 0) {
            ++i;
        } else {
            j = badCharTable[pattern[j]];
        }
    }
    return j == m;
}

int main() {
    std::string target = "hello";
    std::string pattern = "ll";
    std::cout << (isMatch(target, pattern) ? "匹配成功" : "匹配失败") << std::endl;
    return 0;
}

这些方法可以实现自定义的字符串匹配规则。你可以根据自己的需求选择合适的方法。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/80870.html

相关推荐

  • C# Actor如何处理异常情况

    C# Actor如何处理异常情况

    在C#中,Actor模型通常用于构建高度并发和可伸缩的系统 使用try-catch语句处理异常:在Actor的处理逻辑中,使用try-catch语句捕获可能发生的异常。这样,当异常发...

  • 如何利用C# Actor提高系统性能

    如何利用C# Actor提高系统性能

    在C#中,Actor模型是一种并发编程范式,它可以帮助您提高系统的性能和可伸缩性 使用Akka.NET库:Akka.NET是一个功能强大的C# Actor库,它提供了创建、管理和调度...

  • C#中Actor模型的最佳实践是什么

    C#中Actor模型的最佳实践是什么

    在C#中使用Actor模型的最佳实践包括以下几点: 选择合适的Actor框架:在C#中,有一些流行的Actor框架可供选择,如Akka.NET、Orleans和Proto.Actor。根据项目需求...

  • C# Actor模型与普通线程有何区别

    C# Actor模型与普通线程有何区别

    C#中的Actor模型与普通线程在多个方面存在显著差异。以下是它们之间的主要区别:
    隔离性 Actor模型:Actor之间是完全隔离的,不共享任何变量。每个Actor都有...

  • android button属性怎样添加点击事件

    android button属性怎样添加点击事件

    在Android中,为Button添加点击事件可以使用Java或Kotlin。这里分别给出两种语言的实现方法。 使用Java: 首先,在布局文件(例如activity_main.xml)中添加一个...

  • android button属性能否设置圆角

    android button属性能否设置圆角

    在Android中,Button的属性本身并不直接支持设置圆角。然而,你可以通过创建一个带有圆角的背景图片,并将这个图片设置为Button的背景来实现圆角效果。
    以下...

  • 如何用android button属性调整大小

    如何用android button属性调整大小

    在Android中,您可以通过设置layout_width和layout_height属性来调整Button的大小 打开您的项目的res/layout目录下的布局XML文件。例如:activity_main.xml。 在...

  • 如何用python print方法打印元组

    如何用python print方法打印元组

    在Python中,你可以使用print()函数来打印元组。这是一个例子:
    # 定义一个元组
    my_tuple = (1, 2, 3, 4, 5) # 使用print()函数打印元组
    print(m...