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

หาตัวอักษรที่ไม่ซ้ำตัวแรกในสตริงด้วยการ遍历ครั้งเดียวใน C++


บทนำ

ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีหาตัวอักษรที่ไม่ซ้ำ (Non-repeating character) ตัวแรกในสตริงโดยใช้การ遍历 (traversal) เพียงครั้งเดียว

ตัวอย่าง

Input: "tutorialspoint"
Output: "u"

ขั้นตอนการแก้ปัญหา

  1. กำหนดสตริง
  2. สร้าง map เพื่อเก็บความถี่ (frequency) และดัชนี (index) ของแต่ละตัวอักษร
  3. วนลูปผ่านสตริง 1 ครั้ง เพื่อนับความถี่และบันทึกดัชนี
  4. วนลูปผ่าน map เพื่อหาตัวอักษรที่มีความถี่ = 1 และมีดัชนีน้อยที่สุด
  5. พิมพ์ตัวอักษรนั้น

ตัวอย่างโค้ด

#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 คือจำนวนตัวอักษรที่ไม่ซ้ำ หากมีคำถาม สามารถถามได้ในส่วนความคิดเห็นครับ