สมมติว่าเรามีสตริงสองสตริง 'a' และ 'b' เราต้องตรวจสอบว่าสตริงสองสตริงที่กำหนดเป็น anagram ของกันหรือไม่ สองสตริงถูกกล่าวว่าเป็น anagram ของกันถ้าสตริงหนึ่งมีตัวอักษรเดียวกันกับอีกสตริงหนึ่ง
ตัวอย่างอินพุต 1
a = "anagram", b = "gnarama"
เอาต์พุต
True
คำอธิบาย
สตริง 'gnarama' มีตัวอักษรเดียวกับสตริง 'anagram' ดังนั้นเราคืนค่า True
ตัวอย่างอินพุต 2
a = "programmer", b = "mprogretmrqp"
เอาต์พุต
False
คำอธิบาย
สตริง 'b' มีตัวอักษรมากกว่าสตริง 'a' และเราสามารถบอกได้ว่าความยาวของสตริงต่างกัน ดังนั้นเราคืนค่า False
วิธีการแก้ปัญหา
สำหรับสตริงสองสตริงที่กำหนด เรามีความยาวของสตริง ถ้าความยาวของสตริงต่างกัน เราจะคืนค่า False มิฉะนั้นถ้าความยาวของสตริงเท่ากัน เราจะตรวจสอบว่าแต่ละตัวอักษรของสตริงนั้นตรงกับตัวอักษรของอีกสตริงหนึ่งและคืนค่า True มิฉะนั้น False
- รับอินพุตสตริงสองสตริง 'a' และ 'b'
- ฟังก์ชัน Boolean checkAnagram(string a, string b) รับสตริงสองสตริง 'a' และ 'b' และคืนค่าว่าพวกเขาเป็น anagram ของกันหรือไม่
- หาความยาวของสตริง 'a' และ 'b' และตรวจสอบว่าพวกเขาเท่ากันหรือไม่ ถ้าไม่เท่ากันให้คืนค่า false
- ใช้ C++ STL (Standard Template Library) map function สร้าง hash table ของแต่ละตัวอักษรของสตริง 'a' โดยวนลูปผ่านสตริง 'a'
- ขณะสร้าง map ของแต่ละตัวอักษรของสตริง 'a' ลบตัวอักษรเหล่านั้นที่มีอยู่ในสตริง 'b'
- จากนั้นวนลูปผ่าน map และตรวจสอบ ถ้ามีตัวอักษรเหลืออยู่ใน hash table ให้คืนค่า False มิฉะนั้นคืนค่า 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
เนื่องจากทั้งสองสตริงอินพุตเป็น anagram ของกัน ดังนั้นจึงคืนค่า True คือ '1'