Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ตรวจสอบว่าสตริงสองสตริงเป็น Anagram ของกันหรือไม่โดยใช้ C++

สมมติว่าเรามีสตริงสองสตริง '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'