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

C++の特定のリスト内のすべての単語の最短の一意のプレフィックスを検索します


この問題では、一連の単語arr[]が与えられます。私たちのタスクは、指定されたリスト内のすべての単語の最短の一意のプレフィックスを見つけることです。

問題を理解するために例を見てみましょう

入力

arr[] = {“learn”, “programming”, “code”}

出力

c leap lear p

ソリューションアプローチ

この問題の簡単な解決策は、単語のすべての接頭辞を見つけて、それが配列内の他の単語の接頭辞であるかどうかを確認することです。そうでない場合は、印刷してください。

効率的なアプローチ トライデータ構造を使用することです。トライを作成し、すべての単語を保存します。次に、挿入中に各単語にアクセスする頻度を見つけます。単語を使用して、接頭辞であるルートへのパスを見つけます。頻度1のノードから始まるすべてのプレフィックスを出力します。

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
#define MAX 256
struct trieNode {
   struct trieNode *child[MAX];
   int freq;
};
struct trieNode *newTrieNode(void){
   struct trieNode *newNode = new trieNode;
   newNode->freq = 1;
   for (int i = 0; i<MAX; i++)
      newNode->child[i] = NULL;
   return newNode;
}
void insert(struct trieNode *root, string str) {
   int len = str.length();
   struct trieNode *pCrawl = root;
   for (int level = 0; level<len; level++) {
      int index = str[level];
      if (!pCrawl->child[index])
         pCrawl->child[index] = newTrieNode();
      else
         (pCrawl->child[index]->freq)++;
      pCrawl = pCrawl->child[index];
   }
}
void findShortestUniquePrefixRec(struct trieNode *root, char prefixChar[], int ind) {
   if (root == NULL)
      return;
   if (root->freq == 1) {
      prefixChar[ind] = '\0';
      cout<<prefixChar<<endl;
      return;
   }
   for (int i=0; i<MAX; i++) {
      if (root->child[i] != NULL) {
         prefixChar[ind] = i;
         findShortestUniquePrefixRec(root->child[i], prefixChar, ind+1);
      }
   }
}
void findShortestUniquePrefix(string arr[], int n) {
   struct trieNode *root = newTrieNode();
   root->freq = 0;
   for (int i = 0; i<n; i++)
      insert(root, arr[i]);
   char prefixChar[250];
   findShortestUniquePrefixRec(root, prefixChar, 0);
}
int main() {
   string arr[] = {"learn", "programming", "code", "leap"};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout<<"All Shortest unique prefix for every words in a given list are : \n";
   findShortestUniquePrefix(arr, n);
   return 0;
}

出力

All Shortest unique prefix for every words in a given list are −
c
leap
lear
p

  1. C++の配列内のすべての要素に最も近い値を検索します

    ここでは、配列内のすべての要素に最も近い値を見つける方法を説明します。要素xに、それよりも大きい次の要素があり、配列にも存在する場合、それはその要素のより大きな値になります。要素が存在しない場合は、-1を返します。配列要素が[10、5、11、6、20、12]であるとすると、大きい方の要素は[11、6、12、10、-1、20]になります。 20は配列内でそれ以上の値を持たないため、-1を出力します。 これを解決するために、C++STLのセットを使用します。セットは、バイナリツリーアプローチを使用して実装されます。二分木では、常に順序の後続が次に大きい要素です。したがって、O(log n)時間で

  2. 特定のプレフィックス式の式ツリーを構築するC++プログラム

    式ツリーは基本的に、式を表すために使用される二分木です。式ツリーでは、内部ノードは演算子に対応し、各リーフノードはオペランドに対応します。これは、インオーダー、プレオーダー、ポストオーダートラバーサルでプレフィックス式の式ツリーを構築するC++プログラムです。 アルゴリズム Begin    class ExpressionTree which has following functions:    function push() to push nodes into the tree:    If stack is null &nb