ในปัญหานี้ เราได้รับอาร์เรย์ของคำ 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