เราได้รับสตริงอาร์เรย์ของคำในขนาดที่กำหนด และภารกิจคือการแบ่งคำด้วยวิธีที่เป็นไปได้ทั้งหมด ซึ่งหลังจากการแบ่งสตริงที่ก่อตัวขึ้นควรเป็นสตริงที่ถูกต้อง และเราต้องคำนวณตัวแบ่งคำขั้นต่ำทั้งหมดตาม ปัญหา
ให้เราดูสถานการณ์อินพุตเอาต์พุตต่างๆ สำหรับสิ่งนี้ -
ใน − string word[] ={"Hello", "Hell", "tell", "well", "bell", "ball", "all" }
ออก − ตัวแบ่งคำขั้นต่ำคือ:1
คำอธิบาย − เราได้รับหลายคำ ตอนนี้เราจะผ่านการต่อกันของสองสตริงนั่นคือ นรกและทั้งหมด และจะทำลายคำที่ต่อกัน ดังนั้น Hellall สามารถแบ่งออกเป็น "Hellall" ซึ่งเป็นช่วงแรกและทั้งสองคำถูกต้อง ตอนนี้เราจะทำลายมันต่อไปเช่น "He ll aa" ซึ่งไม่ได้สร้างสตริงที่ถูกต้อง ผลลัพธ์ที่ได้คือ 1
ใน − string word[] ={"Hello", "Hell", "tell", "well", "bell", "ball", "all" }
ออก − ตัวแบ่งคำขั้นต่ำคือ:1
คำอธิบาย − เราได้รับหลายคำ ตอนนี้เราจะผ่านการต่อกันของสองสตริงนั่นคือ นรกและดี และจะทำลายคำที่ต่อกัน ดังนั้น Hellwell จึงสามารถแบ่งได้เป็น "Hell well" ซึ่งเป็นช่วงแรกและทั้งสองคำถูกต้อง ตอนนี้เราจะทำลายมันต่อไปเช่น "เขาสบายดี" ซึ่งไม่ได้สร้างสตริงที่ถูกต้อง ผลลัพธ์ที่ได้คือ 1
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
ป้อนอาร์เรย์สตริงของคำและคำนวณขนาดโดยใช้ฟังก์ชัน size()
-
ประกาศตัวแปรเป็น min_val และตั้งค่าเป็น INT_MAX เป็นค่าสูงสุดที่เป็นไปได้
-
สร้างวัตถุประเภทโครงสร้างเป็นรูทและตั้งค่าให้เรียกใช้ฟังก์ชัน Return_Node()
-
เริ่มลูป FOR จาก i ถึง 0 จนถึงขนาดของอาร์เรย์ ภายในลูป ให้เรียกใช้ฟังก์ชัน Insert_Node() เพื่อแทรกโหนดในแผนผัง
-
เรียก Minimum_Break() เพื่อคำนวณตัวแบ่งคำขั้นต่ำที่เป็นไปได้และพิมพ์ผลลัพธ์สุดท้าย
-
ประกาศโครงสร้างเพื่อสร้าง tree of nodes โดยมีคำเป็นข้อมูล
-
สร้างอาร์เรย์ของพอยน์เตอร์เป็น ptr[total_Alpha] และตัวแปรบูลีนเป็นเช็ค
-
-
ภายใน Return_Node(เป็นโมฆะ)
-
สร้างตัวชี้ของโครงสร้างประเภทเป็น ptr_1 ตั้งค่า ptr_1->ตรวจสอบว่าเป็นเท็จ
-
เริ่มวนรอบ FOR จาก i ถึง 0 จนถึง i น้อยกว่า total_Alpha ภายในลูป ให้ตั้งค่า ptr_1->ptr[i] เป็น NULL
-
กลับ ptr_1
-
-
ภายในฟังก์ชัน Insert_Node(struct node* root, string val)
-
สร้างตัวชี้เป็น ptr_1 และตั้งค่าเป็นรูท
-
เริ่มวนรอบ FOR จาก i ถึง 0 จนถึง val.length() ภายในลูป ให้ตั้งค่าคีย์เป็น val[i] - 'a' และตรวจสอบว่า ptr_1->ptr[key] เป็น NULL แล้วตั้งค่า ptr_1->ptr[key] เป็นการเรียกใช้ฟังก์ชัน Return_Node()
-
ตั้งค่า ptr_1 เป็น ptr_1->ptr[key] และ ptr_1->ตรวจสอบเป็นจริง
-
-
ภายในฟังก์ชัน Minimum_Break(struct node* root, string val, int first, int* temp, int a =0)
-
สร้างตัวชี้เป็น ptr_1 และตั้งค่าเป็นรูท
-
ตรวจสอบ IF first =val.length() จากนั้นตั้งค่า *temp เพื่อเรียกใช้ฟังก์ชัน inbuilt ของ C++ ซึ่งเป็นค่า min(*temp, a - 1) และส่งคืน
-
เริ่มวนรอบ FOR จาก i ถึงก่อน จนถึง i น้อยกว่าความยาวของวาล ภายในลูป ให้ตั้งค่าที่อยู่เป็น val[i] - 'a' และตรวจสอบว่า ptr_1->ptr[address] เป็นโมฆะแล้วส่งคืน
-
ตรวจสอบว่า ptr_1->ptr[address]->check เป็นจริง จากนั้นให้เรียก Minimum_Break(root, val, i + 1, temp, a + 1)
-
ตั้งค่า ptr_1 เป็น ptr_1->ptr[ที่อยู่].
-
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; #define total_Alpha 26 //create a tree of nodes of words struct node{ struct node* ptr[total_Alpha]; bool check; }; //Return tree with all nodes struct node* Return_Node(void){ struct node* ptr_1 = new node; ptr_1->check = false; for (int i = 0; i < total_Alpha; i++){ ptr_1->ptr[i] = NULL; } return ptr_1; } //insert values to the nodes in a tree void Insert_Node(struct node* root, string val){ struct node* ptr_1 = root; for(int i = 0; i < val.length(); i++){ int key = val[i] - 'a'; if(!ptr_1->ptr[key]){ ptr_1->ptr[key] = Return_Node(); } ptr_1 = ptr_1->ptr[key]; } ptr_1->check = true; } //calculate the minimum word break void Minimum_Break(struct node* root, string val, int first, int* temp, int a = 0){ struct node* ptr_1 = root; if(first == val.length()){ *temp = min(*temp, a - 1); return; } for(int i = first; i < val.length(); i++){ int address = val[i] - 'a'; if(!ptr_1->ptr[address]){ return; } if(ptr_1->ptr[address]->check){ Minimum_Break(root, val, i + 1, temp, a + 1); } ptr_1 = ptr_1->ptr[address]; } } int main(){ string word[] = {"Hello", "Hell", "tell", "well", "bell", "ball", "all" }; int size = sizeof(word) / sizeof(word[0]); int min_val = INT_MAX; struct node* root = Return_Node(); for (int i = 0; i < size; i++){ Insert_Node(root, word[i]); } Minimum_Break(root, "Hellall", 0, &min_val, 0); cout<<"Minimum Word Break is: "<< min_val; return 0; }
ผลลัพธ์
หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้
Minimum Word Break is: 1