设计一个c++程序,在不使用头文件string 的前提下实现字符串的基本操作(获取长度、字符串的运算)以及使用KMP算法比较两个字符串是否匹配
时间: 2024-11-09 14:19:55 浏览: 57
cPP.zip_cpp字符串乘法
在C++中,虽然标准库中的`<string>`头文件包含了丰富的字符串处理功能,但我们可以在不依赖它的前提下实现一些基本的字符串操作。首先,我们可以自定义一个简单的字符串结构体,并提供获取长度的方法。这里我们仅展示核心部分,没有包括完整的运算符重载。
```cpp
#include <iostream>
#include <vector>
// 定义一个字符数组作为基本字符串类型
class BasicString {
private:
std::vector<char> str;
public:
// 构造函数
BasicString(const char* s) : str(s, s + strlen(s)) {}
// 获取字符串长度
int length() const { return static_cast<int>(str.size()); }
// 用于打印字符串
friend std::ostream& operator<<(std::ostream& os, const BasicString& str);
};
// 实现 << 运算符
std::ostream& operator<<(std::ostream& os, const BasicString& str) {
for (const char c : str.str)
os.put(c);
return os;
}
// KMP 搜索算法
size_t KMP_search(const BasicString& text, const BasicString& pattern) {
size_t n = text.length();
size_t m = pattern.length();
std::vector<int> lps(m);
build_lps(pattern, lps);
size_t i = 0, j = 0;
while (i < n) {
if (text[i] == pattern[j])
++i, ++j;
else if (j > 0)
j = lps[j - 1];
else
++i;
if (j == m)
return i - m;
}
return n; // 如果没找到,返回文本长度
}
// 动态计算最长公共前缀(LPS)
void build_lps(const BasicString& pattern, std::vector<int>& lps) {
int len = 0;
lps[0] = 0;
for (int i = 1; i < pattern.length(); ++i) {
if (pattern[i] == pattern[len]) {
len++;
lps[i] = len;
} else if (len > 0) {
len = lps[len - 1];
}
}
}
int main() {
BasicString str1("Hello, World!");
BasicString str2("World");
std::cout << "String 1: " << str1 << "\n";
std::cout << "Length of string 1: " << str1.length() << "\n";
if (KMP_search(str1, str2) != str2.length()) {
std::cout << "Strings don't match\n";
} else {
std::cout << "Strings match\n";
}
return 0;
}
```
阅读全文