บทนำ
ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีหาตัวอักษรที่ไม่ซ้ำ (Non-repeating character) ตัวแรกในสตริงโดยใช้การ遍历 (traversal) เพียงครั้งเดียว
ตัวอย่าง
Input: "tutorialspoint"
Output: "u"
ขั้นตอนการแก้ปัญหา
- กำหนดสตริง
- สร้าง map เพื่อเก็บความถี่ (frequency) และดัชนี (index) ของแต่ละตัวอักษร
- วนลูปผ่านสตริง 1 ครั้ง เพื่อนับความถี่และบันทึกดัชนี
- วนลูปผ่าน map เพื่อหาตัวอักษรที่มีความถี่ = 1 และมีดัชนีน้อยที่สุด
- พิมพ์ตัวอักษรนั้น
ตัวอย่างโค้ด
#include <bits/stdc++.h>
#include <map>
using namespace std;
void findDistinctCharacters(string random_string) {
// map เก็บ [ความถี่, ดัชนี]
map<char, int[2]> chars;
// วนลูปนับความถี่และบันทึกดัชนี
for (int i = 0; i < random_string.size(); ++i){
chars[random_string[i]][0]++;
chars[random_string[i]][1] = i;
}
int char_index = INT_MAX;
// หาตัวอักษรความถี่ 1 ที่มีดัชนีน้อยที่สุด
for (auto item: chars) {
if (item.second[0] == 1) {
char_index = min(char_index, item.second[1]);
}
}
cout << random_string[char_index];
}
int main() {
findDistinctCharacters("tutorialspoint");
return 0;
}
ผลลัพธ์
u
การปรับปรุงประสิทธิภาพ
โค้ดต้นฉบับใช้ map<char, int[2]> ซึ่งใน C++ มาตรฐานอาจมีปัญหากับอาร์เรย์ใน map แนะนำให้ใช้ unordered_map<char, pair<int, int>> หรือโครงสร้างข้อมูลเฉพาะแทน เพื่อประสิทธิภาพและความถูกต้องที่ดีกว่า
สรุป
อัลกอริทึมนี้ใช้เวลา O(n) และพื้นที่ O(k) โดย k คือจำนวนตัวอักษรที่ไม่ซ้ำ หากมีคำถาม สามารถถามได้ในส่วนความคิดเห็นครับ