สมมติว่าเราได้ให้สองสตริง 'a' และ 'b เราต้องตรวจสอบว่าสตริงที่ให้มาสองสายนั้นเป็นแอนนาแกรมของกันและกันหรือไม่ สองสตริงเรียกว่าแอนนาแกรมของกันและกัน ถ้าสตริงหนึ่งมีอักขระเดียวกันกับอีกสตริงหนึ่ง
ตัวอย่างเช่น
อินพุต-1 −
a= anagram b= gnarama
ผลผลิต −
True
คำอธิบาย − สตริง 'gnarama' มีอักขระเดียวกับสตริงที่ 'anagram' มี ดังนั้นเราจึงคืนค่า True.
อินพุต-2 −
a= programmer b= mprogretmrqp
ผลผลิต −
False
คำอธิบาย − สตริง 'b' มีอักขระมากกว่าสตริง 'a' ดังนั้นเราจึงสามารถพูดได้ว่าความยาวของสตริงนั้นแตกต่างกัน ดังนั้นเราจึงคืนค่าเป็นเท็จ
แนวทางที่ใช้ในโปรแกรมด้านล่างเพื่อแก้ปัญหานี้มีดังต่อไปนี้
สำหรับสองสตริงที่กำหนด เรามีความยาวของสตริงหากความยาวของสตริงแตกต่างกัน เราจะคืนค่าเป็นเท็จ มิฉะนั้น หากความยาวของสตริงเท่ากัน เราจะตรวจสอบว่าอักขระแต่ละตัวของสตริงนั้นตรงกับอักขระของสตริงอื่นหรือไม่ และคืนค่า True มิฉะนั้นเป็นเท็จ
-
รับอินพุตสองสตริง 'a' และ 'b'
-
ฟังก์ชันบูลีน checkAnagram(สตริง a, สตริง b) รับสองสตริง 'a' และสตริง 'b' และส่งคืนว่าเป็นแอนนาแกรมของกันและกันหรือไม่
-
ค้นหาความยาวของสตริง 'a' และ 'b' และตรวจสอบว่าเท่ากันหรือไม่ หากไม่เท่ากันให้คืนค่าเท็จ
-
ใช้ฟังก์ชันแมป C++ STL (ไลบรารีเทมเพลตมาตรฐาน) สร้างตารางแฮชของอักขระแต่ละตัวของสตริง 'a' โดยการวนซ้ำสตริง 'a'
-
ในขณะที่สร้างแผนที่ของอักขระแต่ละตัวของสตริง 'a' ให้ลบอักขระที่มีอยู่ในสตริง 'b'
-
จากนั้นวนซ้ำบนแผนที่และตรวจสอบว่ามีอักขระใดเหลืออยู่ในตารางแฮชและคืนค่าเป็นเท็จมิฉะนั้นให้คืนค่า True
ตัวอย่าง
#include<bits/stdc++.h> using namespace std; bool checkAnagram(string a, string b){ int len1= a.length(); int len2= b.length(); if(len1!= len2) { return false; } unordered_map <char,int> mp; for(int i=0;i<a.size();i++) { mp[a[i]]++; mp[b[i]]--; } for(auto it:mp){ if(it.second) return false; } return true; } int main(){ string a= "anagram"; string b= "gnarama"; cout<< checkAnagram(a,b)<<endl; return 0; }
ผลลัพธ์
หากเราจะเรียกใช้โค้ดข้างต้น มันจะพิมพ์ผลลัพธ์เป็น,
1
เนื่องจากสตริงอินพุตทั้งคู่เป็นแอนนาแกรมของกันและกันจึงส่งกลับ True เช่น '1'