Maison  >  Article  >  développement back-end  >  Demander si la chaîne B existe en tant que sous-chaîne dans la chaîne A

Demander si la chaîne B existe en tant que sous-chaîne dans la chaîne A

WBOY
WBOYavant
2023-09-03 12:25:10977parcourir

Demander si la chaîne B existe en tant que sous-chaîne dans la chaîne A

介绍

Dans ce tutoriel, nous verrons des requêtes pour vérifier si la chaîne B existe en tant que sous-chaîne de la chaîne A. Une sous-chaîne est une chaîne qui fait partie de la chaîne principale. Dans le tableau de requête, il y a des valeurs entières, et l'index de la chaîne A sera vérifié pour voir si ces valeurs entières correspondent ou non à la sous-chaîne B. Nous utilisons des requêtes C++ pour savoir si B est une sous-chaîne de A ou non. Dans cette approche, il existe une chaîne A et B est la sous-chaîne de A. Les requêtes en C++ sont des valeurs entières représentées sous forme de tableau. Il existe une chaîne A, B est la sous-chaîne et i est la valeur entière de certaines requêtes. Si la sous-chaîne B est présente dans la chaîne A aux valeurs d'index de requête, la sortie sera Oui, sinon la sortie est Non.

Mise en œuvre 1

的中文翻译为:

实施方案1

String A = “ababababa”
Substring B = “aba”
Queries[] = {0,1, 2, 3}

Sortie

A[0,2] = Yes
A[1,3] = No

Dans l'exemple ci-dessus, en A[0,2], les caractères aux valeurs d'index 0 à 2 sont « aba » et égaux à la sous-chaîne B. Ainsi, le résultat est « Oui ».

À A[1, 3], les caractères aux valeurs d'index 1 à 3 sont « bab » et ne sont pas égaux à la sous-chaîne B. Par conséquent, la sortie est No.

Mise en œuvre 2

A = “TutorialsPoint”
B = “Tutorials”
Queries[] = {0, 9, 14}

Sortie

A[0,9] = Yes
A[1, 10] = No
A[2, 11] = No

Dans l'exemple ci-dessus, nous vérifierons l'existence de la sous-chaîne B dans la chaîne A en utilisant la valeur de requête comme valeur d'index de la chaîne A. À A[0, 9], la sous-chaîne B est présente dans la chaîne A et la sortie est Oui . Après cela, à d'autres valeurs d'indice, B n'est pas présent dans A donc la sortie est No.

Exemple

Pour implémenter l'exemple ci-dessus dans le langage de programmation C++, nous utilisons l'algorithme Rolling Hash pour faire correspondre la sous-chaîne avec la chaîne d'entrée. Calculez les valeurs de hachage de la sous-chaîne B à l'aide de la table de hachage. La table de hachage fournit des paires clé-valeur. Utilisez l'algorithme de hachage roulant pour plus de rapidité et évitez de ressasser la chaîne 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;
}

Sortie

Yes substring is present
No substring is not present
Yes substring is not present

结论

在本教程中,我们开发了代码来实现查找查询以检查子字符串是否存在于字符串中的任务。我们使用了滚动哈希方法来生成查询并获取结果。滚动哈希算法是一种在C++中计算子字符串哈希值的字符串算法,它使用旧值计算哈希值。为了使任务简单和简单,我们使用哈希函数计算哈希值。我们可以根据需要使用多个哈希函数。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer