检查字符串 B 是否存在于字符串 A 中作为子字符串的查询
简介
在本教程中,我们将学习如何使用查询来检查字符串 B 是否是字符串 A 的子字符串。子字符串是主字符串的一部分。在查询数组中,有一些整数值,并将检查字符串 A 的索引以查看这些整数值是否与子字符串 B 匹配。我们使用 C++ 查询来确定 B 是否是 A 的子字符串。在这种方法中,有一个字符串 A,B 是 A 的子字符串。C++ 中的查询是以数组形式表示的整数值。有一个字符串 A,B 是子字符串,i 是某些查询的整数值。如果子字符串 B 出现在字符串 A 的查询索引值中,则输出为“是”,否则输出为“否”。
实现 1
String A = “ababababa” Substring B = “aba” Queries[] = {0,1, 2, 3}
输出
A[0,2] = Yes A[1,3] = No
在上面的示例中,在 A[0,2] 中,索引值 0 到 2 处的字符为“aba”,等于子字符串 B。因此,输出为“是”。
在 A[1, 3] 中,索引值 1 到 3 处的字符为“bab”,与子字符串 B 不相等。因此,输出为“否”。
实现 2
A = “TutorialsPoint” B = “Tutorials” Queries[] = {0, 9, 14}
输出
A[0,9] = Yes A[1, 10] = No A[2, 11] = No
在上面的示例中,我们将使用查询值作为字符串 A 的索引值来检查字符串 A 中是否存在子字符串 B。在 A[0, 9] 中,子字符串 B 出现在字符串 A 中,输出为“是”。在此之后,在其他索引值中,B 不存在于 A 中,因此输出为“否”。
示例
为了在 C++ 编程语言中实现上述示例,我们使用滚动哈希算法将子字符串与输入字符串进行匹配。使用哈希表计算子字符串 B 的哈希值。哈希表提供键值对。使用滚动哈希算法可以加快速度并避免对字符串 A 进行重新哈希。
#include <bits/stdc++.h> #define mod 3803 #define d 26 using namespace std; int hash_y; int* hash_x; int* pro; //user defined function to calculate the hash values int modin(int z){ int q = mod - 2; int r = 1; while (q != 1) { if (q % 2 == 1) r = (r * z) % mod; z = (z * z) % mod; q /= 2; } return (r * z) % mod; } // Function to generate hash void getOut(string& x, string& y){ hash_x = new int[x.size()]; pro = new int[x.size()]; for (int j = y.size() - 1; j >= 0; j--) hash_y = (hash_y * d + (y[j] - 97)) % mod; pro[0] = 1; hash_x[0] = (x[0] - 97) % mod; for (int j = 1; j < x.size(); j++) { pro[j] = (pro[j - 1] * d) % mod; hash_x[j] = (hash_x[j - 1] + pro[j] * (x[j] - 97)) % mod; } } //user defined function to return check substring is present in string or not bool checkEq(int j, int len_x, int len_y){ int z; if (j == 0) z = hash_x[len_y - 1]; else { z = (hash_x[j + len_y - 1] - hash_x[j - 1] + 2 * mod) % mod; z = (z * modin(pro[j])) % mod; } if (z == hash_y) return true; return false; } // Controller int main(){ string x = "TutorialsPoint"; string y = "Tutorials"; //calling function getOut(x, y); //calling queries function int queries[] = { 0, 9, 14}; int q = sizeof(queries) / sizeof(queries[0]); for (int i = 0; i < q; i++){ if (checkEq(queries[i], x.size(), y.size())) cout << "Yes substring is present\n"; else cout << "No substring is not present\n"; } return 0; }
输出
Yes substring is present No substring is not present Yes substring is not present
结论
在本教程中,我们开发了 C++ 代码来实现查找查询的任务,以检查字符串中是否存在子字符串。我们使用了滚动哈希方法来生成查询并获取结果。C++ 中的滚动哈希算法是一种字符串算法,它使用旧值计算子字符串的哈希值。为了使任务更简单,我们使用哈希函数计算了哈希值。我们可以根据需要使用多个哈希函数。
广告