"มาดาม" หรือ "รถแข่ง" คือคำสองคำที่อ่านข้างหลังเหมือนไปข้างหน้า เรียกว่า palindromes
หากเราได้รับคอลเลกชั่นหรือรายการสตริง เราต้องเขียนโค้ด C++ เพื่อดูว่าสามารถรวมสองสตริงในรายการเข้าด้วยกันเพื่อสร้าง palindrome ได้หรือไม่ หากมีคู่ของสตริงดังกล่าวอยู่ในรายการที่กำหนด เราต้องพิมพ์ "ใช่" ไม่เช่นนั้น เราต้องพิมพ์ "ไม่ใช่"
ในบทช่วยสอนนี้ อินพุตจะเป็นอาร์เรย์ของสตริง และเอาต์พุตจะเป็นค่าสตริงตามลำดับ ตัวอย่างเช่น
ป้อนข้อมูล
list[] = {"flat", "tea", "chair", "ptalf", "tea"}
ผลผลิต
Yes
มีคู่ "แบน" และ "ptalf" ซึ่งสร้างสตริง palindrome "flatptalf"
ป้อนข้อมูล
list[] = {"raman", "ram", "na", "ar", "man"}
ผลผลิต
Yes
มีคู่ "na" และ "man" ซึ่งสร้างสตริง palindrome "naman"
แนวทางในการหาแนวทางแก้ไข
แนวทางกำลังดุร้าย
สำหรับแต่ละสตริงในอาร์เรย์ ให้ตรวจสอบสตริงอื่นๆ ทั้งหมดว่าสร้างพาลินโดรมกับสตริงอื่นหรือไม่ หากพบคู่ดังกล่าว ให้คืนค่า จริง หากองค์ประกอบอาร์เรย์ทั้งหมดถูกสำรวจเพื่อค้นหาคู่ดังกล่าว และไม่พบคู่ที่เหมาะสม ให้คืนค่าเท็จ
ความซับซ้อนของเวลา :O(N^2)
ความซับซ้อนของอวกาศ :O(1)
ตัวอย่าง
#include<bits/stdc++.h> using namespace std; bool isPalindrome (string str) { int len = str.length (); for (int i = 0; i < len / 2; i++) if (str[i] != str[len - i - 1]) return false; return true; } bool checkPalindromePair (vector < string > vect) { for (int i = 0; i < vect.size () - 1; i++) { for (int j = i + 1; j < vect.size (); j++) { string check_str = ""; check_str = check_str + vect[i] + vect[j]; if (isPalindrome (check_str)) return true; } } return false; } int main () { vector < string > vect = { "flat", "tea", "chair", "ptalf", "tea"}; checkPalindromePair (vect) ? cout << "Yes" : cout << "No"; return 0; }
ผลลัพธ์
Yes
แนวทางที่มีประสิทธิภาพหรือเหมาะสม
เราสามารถใช้โครงสร้างข้อมูลแบบทดลองเพื่อแก้ปัญหานี้ได้
ขั้นแรก เราต้องสร้าง trie ว่าง และสำหรับแต่ละสตริงในอาร์เรย์ เราต้องแทรกส่วนกลับของคำปัจจุบัน &เก็บว่าดัชนีใดเป็นพาลินโดรม จากนั้นเราต้องสำรวจอาร์เรย์อีกครั้ง และสำหรับแต่ละสตริง เราต้องทำสิ่งต่อไปนี้ -
-
หากมีให้ใน True ให้คืนค่า true
-
หากมีบางส่วน -- ตรวจสอบว่าคำที่เหลือคือ palindrome หรือไม่ ถ้าใช่ ให้คืนค่า จริง ซึ่งหมายความว่าคู่สร้าง palindrome
ความซับซ้อนของเวลา:O(Nk^2)
ความซับซ้อนของอวกาศ:O(N)
โดยที่ N คือจำนวนคำในรายการ และ k คือความยาวสูงสุดที่ตรวจสอบสำหรับ palindrome
ตัวอย่างที่ 2
#include<bits/stdc++.h> using namespace std; #define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) #define ALPHABET_SIZE (26) #define CHAR_TO_INDEX(c) ((int)c - (int)'a') struct TrieNode { struct TrieNode *children[ALPHABET_SIZE]; vector < int >pos; int id; bool isLeaf; }; struct TrieNode * getNode (void) { struct TrieNode *pNode = new TrieNode; pNode->isLeaf = false; for (int i = 0; i < ALPHABET_SIZE; i++) pNode->children[i] = NULL; return pNode; } bool isPalindrome (string str, int i, int len) { while (i < len) { if (str[i] != str[len]) return false; i++, len--; } return true; } void insert (struct TrieNode *root, string key, int id) { struct TrieNode *pCrawl = root; for (int level = key.length () - 1; level >= 0; level--) { int index = CHAR_TO_INDEX (key[level]); if (!pCrawl->children[index]) pCrawl->children[index] = getNode (); if (isPalindrome (key, 0, level)) (pCrawl->pos).push_back (id); pCrawl = pCrawl->children[index]; } pCrawl->id = id; pCrawl->pos.push_back (id); pCrawl->isLeaf = true; } void search (struct TrieNode *root, string key, int id, vector < vector < int > >&result) { struct TrieNode *pCrawl = root; for (int level = 0; level < key.length (); level++) { int index = CHAR_TO_INDEX (key[level]); if (pCrawl->id >= 0 && pCrawl->id != id && isPalindrome (key, level, key.size () - 1)) result.push_back ( { id, pCrawl->id} ); if (!pCrawl->children[index]) return; pCrawl = pCrawl->children[index]; } for (int i:pCrawl->pos) { if (i == id) continue; result.push_back ( { id, i} ); } } bool checkPalindromePair (vector < string > vect) { struct TrieNode *root = getNode (); for (int i = 0; i < vect.size (); i++) insert (root, vect[i], i); vector < vector < int >>result; for (int i = 0; i < vect.size (); i++) { search (root, vect[i], i, result); if (result.size () > 0) return true; } return false; } // Driver code int main () { vector < string > vect = { "flat", "tea", "chair", "ptalf", "tea"}; checkPalindromePair (vect) ? cout << "Yes" : cout << "No"; return 0; }
ผลลัพธ์
Yes
บทสรุป
ในบทช่วยสอนนี้ เราได้เรียนรู้วิธีค้นหาคู่พาลินโดรมในอาร์เรย์ด้วยสองวิธี (Bruteforce และ Optimized) เรายังเขียนโค้ดนี้ในภาษาจาวา ไพธอน และภาษาอื่นๆ ได้ด้วย วิธีแรกคือวิธีพื้นฐานในการค้นหาวิธีแก้ปัญหาโดยสำรวจองค์ประกอบที่กำหนดทั้งหมด ในทางตรงกันข้าม วิธีที่สองใช้โครงสร้างข้อมูลแบบทดลองเพื่อให้คำตอบคือความซับซ้อนของเวลาเชิงเส้นเกือบ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์