บทนำ
ในบทช่วยสอนนี้ เราจะหา ตัวอักษรที่ไม่ซ้ำกัน (uncommon/distinct characters) ระหว่างสองสตริง คือตัวอักษรที่ปรากฏในสตริงใดสตริงหนึ่ง แต่ไม่ปรากฏในอีกสตริงหนึ่ง
ตัวอย่าง
Input: string_one = "tutorialspoint", string_two = "tutorialsworld"
Output: d n p w
อัลกอริทึม: Hashing (Map)
ใช้ map เก็บสถานะของแต่ละตัวอักษร:
- 1 = ปรากฏในสตริงแรกเท่านั้น
- 0 = ปรากฏในทั้งสองสตริง (common)
- 1 (ใหม่) = ปรากฏในสตริงที่สองเท่านั้น
ขั้นตอนการแก้ปัญหา
- กำหนดสตริงทั้งสอง
- สร้าง map<char, int> chars
- วนลูปสตริงแรก: เพิ่มทุกตัวอักษรเข้า map ค่า = 1
- วนลูปสตริงที่สอง:
- ถ้ามีใน map แล้ว → ตั้งค่า = 0 (common)
- ถ้ายังไม่มี → เพิ่มเข้า map ค่า = 1
- วนลูป map พิมพ์ตัวอักษรที่มีค่า = 1
ตัวอย่างโค้ด
#include <bits/stdc++.h>
#include <map>
using namespace std;
void findDistinctCharacters(string one, string two) {
map chars;
// สตริงแรก: เพิ่มทุกตัวอักษรค่า 1
for (int i = 0; i < one.size(); ++i) {
chars.insert({one[i], 1});
}
// สตริงที่สอง: อัปเดตสถานะ
for (int i = 0; i < two.size(); ++i) {
if (chars.count(two[i])) {
chars.find(two[i])->second = 0; // common
} else {
chars.insert({two[i], 1}); // ใหม่
}
}
// พิมพ์ตัวอักษรที่ไม่ซ้ำ (ค่า = 1)
for (auto item : chars) {
if (item.second == 1) {
cout << item.first << " ";
}
}
}
int main() {
string one = "tutorialspoint";
string two = "tutorialsworld";
findDistinctCharacters(one, two);
return 0;
}
ผลลัพธ์
d n p w
วิธีที่ดีกว่า (ใช้ unordered_set)
void findDistinctSTL(string a, string b) {
unordered_set setA(a.begin(), a.end());
unordered_set setB(b.begin(), b.end());
// Symmetric difference
for (char c : setA) if (!setB.count(c)) cout << c << " ";
for (char c : setB) if (!setA.count(c)) cout << c << " ";
}
สรุป
ใช้ Hash Map/Set หาตัวอักษรที่ไม่ซ้ำระหว่างสองสตริง O(n+m) เวลา หากมีคำถาม สามารถถามได้ในส่วนความคิดเห็นครับ