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