プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

アナグラムパターン検索


アナグラムは基本的に、特定の文字列またはパターンのすべての順列です。このパターン検索アルゴリズムは少し異なります。この場合、正確なパターンが検索されるだけでなく、テキスト内の指定されたパターンのすべての可能な配置が検索されます。

この問題を解決するために、テキスト全体をパターンと同じ長さのいくつかのウィンドウに分割します。次に、パターンの各文字が検出され、配列に格納されます。また、ウィンドウごとに、カウント配列を見つけて、それらが一致しているかどうかを確認します。

アナグラムパターン検索アルゴリズムの時間計算量はO(n)です。

入力と出力

Input:
The main String “AABAACBABBCABAABBA”. The pattern “AABC”.
Output:
Anagram found at position: 2
Anagram found at position: 3
Anagram found at position: 4
Anagram found at position: 10

アルゴリズム

anagramSearch(text, pattern)

入力- メインストリングとパターン

出力- パターンとそのすべてのアナグラムが見つかったすべての場所。

Begin
   define patternFreq array and stringFreq array
   patLne := length of pattern
   stringLen := length of the text
   set all entries of patternFreq array to 0

   for all characters present in pattern, do
      increase the frequency.
   done

   for i := 0 to i<= stringLen – patLen, do
      set all entries of stringFreq to 0
      for all characters of each window, do
         increase the frequency
      done

      if the stringFreq and patternFreq are same, then
         display the value of i, as anagram found at that location
   done
End

#include<iostream>
#include<cstring>
#define LETTER 26
using namespace std;

bool arrayCompare(int *array1, int *array2, int n) {
   for(int i = 0; i<n; i++) {
      if(array1[i] != array2[i])
         return false; //if there is one mismatch stop working
   }
   return true; //arrays are identical
}

void setArray(int *array, int n, int value) {
   for(int i = 0; i<n; i++)
      array[i] = value; //put value for all places in the array
}

void anagramSearch(string mainString, string patt, int *array, int *index) {
   int strFreq[LETTER], pattFreq[LETTER];
   int patLen = patt.size();
   int stringLen = mainString.size();
   setArray(pattFreq, LETTER, 0);    //initialize all frequency to 0

   for(int i = 0; i<patLen; i++) {
      int patIndex = patt[i] - 'A';   //subtract ASCII of A
      pattFreq[patIndex]++;           //increase frequency
   }

   for(int i = 0; i<=(stringLen - patLen); i++) {    //the range where window will move
      setArray(strFreq, LETTER, 0);         //initialize all frequency to 0 for main string
      for(int j = i; j<(i+patLen); j++){    //update frequency for each window.
         int strIndex = mainString[j] - 'A';
         strFreq[strIndex]++;               //increase frequency
      }

      if(arrayCompare(strFreq, pattFreq, LETTER)) {    //when both arrays are identical
         (*index)++;
         array[*index] = i;           //anagram found at ith position
      }
   }
}

int main() {
   string mainStrng = "AABAACBABBCABAABBA";
   string pattern = "AABC";
   int matchLocation[mainStrng.size()];
   int index = -1;
   anagramSearch(mainStrng, pattern, matchLocation, &index);

   for(int i = 0; i<=index; i++) {
      cout << "Anagram found at position: " << matchLocation[i] << endl;
   }

}

出力

Anagram found at position: 2
Anagram found at position: 3
Anagram found at position: 4
Anagram found at position: 10

  1. データ構造における最適な二分木

    整数のセットはソートされた順序で与えられ、別の配列は頻度カウントに頻繁に与えられます。私たちのタスクは、これらのデータを使用してバイナリ検索ツリーを作成し、すべての検索の最小コストを見つけることです。 サブ問題の解を解いて保存するために、補助配列cost [n、n]が作成されます。コストマトリックスは、ボトムアップ方式で問題を解決するためのデータを保持します。 入力 −ノードおよび頻度としてのキー値。 Keys = {10, 12, 20} Frequency = {34, 8, 50} 出力 −最小コストは142です。 これらは、指定された値から可能なBSTです。 ケース1の

  2. アナグラム部分文字列検索用のPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −テキストとパターンが与えられた場合、パターンのすべての出現とその順列(またはアナグラム)をテキストで印刷する必要があります。 次に、以下の実装のソリューションを見てみましょう- 例 # maximum value MAX = 300 # compare def compare(arr1, arr2):    for i in range(MAX):       if arr1[i] != arr2[i]:       &nbs