ในปัญหานี้ เราได้รับอาร์เรย์ของสตริงและเราต้องพิมพ์คู่ของแอนนาแกรมของอาร์เรย์ที่กำหนด
แอนนาแกรม เป็นสตริงที่เกิดขึ้นจากการจัดเรียงอักขระของสตริงอื่น ชอบ - สวัสดีและ lolhe
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน −
Input: array = {“hello”, “hrdef”, “from”, “lohel”, “morf”}. Output: [hello, lohel] , [from , morf]
เพื่อแก้ปัญหานี้ เราจะใช้การซ้อนลูป เราต้องการสองลูปที่ซ้อนกัน วงนอกจะข้ามอาร์เรย์และเลือกองค์ประกอบ ลูปที่ซ้อนกันจะตรวจสอบแต่ละสตริงและตรวจสอบว่าเป็นแอนนาแกรมหรือไม่
ตัวอย่าง
มาดูโปรแกรมที่จะใช้อัลกอริทึมนั้นกัน −
#include <iostream> using namespace std; #define NO_OF_CHARS 256 bool isAnagramString(string str1, string str2){ int count[NO_OF_CHARS] = {0}; int i; for (i = 0; str1[i] && str2[i]; i++){ count[str1[i]]++; count[str2[i]]--; } if (str1[i] || str2[i]) return false; for (i = 0; i < NO_OF_CHARS; i++) if (count[i]) return false; return true; } void printAnagrams(string arr[], int n){ for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++) if (isAnagramString(arr[i], arr[j])) cout<<arr[i]<<" and "<<arr[j]<<" are anagrams.\n"; } int main(){ string arr[] = {"hello", "hrdef", "from", "lohel", "morf"}; int n = sizeof(arr)/sizeof(arr[0]); printAnagrams(arr, n); return 0; }
ผลลัพธ์
hello and lohel are anagrams. from and morf are anagrams.
วิธีแก้ปัญหานี้ค่อนข้างเข้าใจง่ายแต่มีประสิทธิภาพน้อยกว่า ดังนั้นจึงอาจมีการเพิ่มประสิทธิภาพบางอย่างที่สามารถทำได้กับโซลูชันของเราเพื่อให้มีประสิทธิภาพมากขึ้น เราสามารถทำได้โดยการจัดเรียงอาร์เรย์ของเราที่มีสตริง อาร์เรย์ที่จัดเรียงนี้จะทำให้แอนนาแกรมค้นหาได้ง่ายขึ้น