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

วิธาหาตัวอักษรที่พบมากที่สุดในสตริงด้วย C#

ภาพรวม

การหาตัวอักษรที่เกิดขึ้นบ่อยที่สุด (Highest Occurring Character) ในสตริง สามารถทำได้โดยนับจำนวนครั้งที่แต่ละตัวอักษรปรากฏ แล้วหาค่าสูงสุด

ตัวอย่าง: สตริง "apples are red" → ตัวอักษร 'e' ปรากฏ 3 ครั้ง (มากที่สุด)

ตัวอย่างโปรแกรม

using System;

namespace CharCountDemo
{
    public class Example
    {
        public static void Main()
        {
            string str = "abracadabra";
            int[] charCount = new int[256]; // ASCII 0-255
            int length = str.Length;
            
            // นับจำนวนครั้งของแต่ละตัวอักษร
            for (int i = 0; i < length; i++)
                charCount[str[i]]++;
            
            // หาตัวอักษรที่มีจำนวนมากที่สุด
            int maxCount = -1;
            char maxChar = ' ';
            
            for (int i = 0; i < length; i++)
            {
                if (maxCount < charCount[str[i]])
                {
                    maxCount = charCount[str[i]];
                    maxChar = str[i];
                }
            }
            
            Console.WriteLine("สตริง: " + str);
            Console.WriteLine("ตัวอักษรที่พบมากที่สุด: " + maxChar);
            Console.WriteLine("จำนวนครั้ง: " + maxCount);
        }
    }
}

ผลลัพธ์

สตริง: abracadabra
ตัวอักษรที่พบมากที่สุด: a
จำนวนครั้ง: 5

คำอธิบายอัลกอริทึม

1. สร้างอาร์เรย์นับ (Frequency Array)

int[] charCount = new int[256]; // รองรับ ASCII 0-255
for (int i = 0; i < length; i++)
    charCount[str[i]]++;

ใช้ค่าตัวอักษร (char) เป็นดัชนีโดยตรง เพราะ char ใน C# เป็น UTF-16 (0-65535) แต่ตัวอย่างใช้ ASCII 256 ตัวแรก

2. หาค่าสูงสุด

int maxCount = -1;
char maxChar = ' ';
for (int i = 0; i < length; i++)
{
    if (maxCount < charCount[str[i]])
    {
        maxCount = charCount[str[i]];
        maxChar = str[i];
    }
}

วนลูปผ่านสตริงอีกครั้ง (ไม่ใช่วนอาร์เรย์ 256) เพื่อรักษาลำดับ: หากมีตัวอักษรหลายตัวเท่ากันมากที่สุด จะเลือกตัวที่ปรากฏก่อนในสตริง

การปรับปรุงสำหรับ Unicode (รองรับไทย, อีโมจิ, ฯลฯ)

using System;
using System.Collections.Generic;
using System.Linq;

public class Demo
{
    public static void Main()
    {
        string str = "สวัสดีครับ 😀😀😀";
        
        // ใช้ Dictionary รองรับ Unicode ทุกตัว
        var freq = new Dictionary();
        
        foreach (char c in str)
        {
            if (char.IsWhiteSpace(c)) continue; // ข้าม whitespace ถ้าต้องการ
            freq[c] = freq.GetValueOrDefault(c, 0) + 1;
        }
        
        // หาค่าสูงสุดด้วย LINQ
        var max = freq.OrderByDescending(kvp => kvp.Value).First();
        
        Console.WriteLine($"สตริง: {str}");
        Console.WriteLine($"ตัวอักษรมากที่สุด: '{max.Key}' (U+{(int)max.Key:X4})");
        Console.WriteLine($"จำนวน: {max.Value} ครั้ง");
    }
}

ผลลัพธ์ Unicode

สตริง: สวัสดีครับ 😀😀😀
ตัวอักษรมากที่สุด: '😀' (U+1F600)
จำนวน: 3 ครั้ง

ข้อสังเกตสำคัญ

  • อาร์เรย์ 256 เหมาะสำหรับ ASCII/Extended ASCII เท่านั้น
  • C# char = UTF-16 (16-bit) ต้องใช้อาร์เรย์ 65536 หรือ Dictionary สำหรับ Unicode เต็ม
  • ควรตัดสินใจว่าจะนับ whitespace/punctuation หรือไม่
  • กรณีเท่ากัน (tie) โค้ดตัวอย่างเลือกตัวที่ปรากฏก่อนในสตริง
  • LINQ GroupBy ทำได้สั้นกว่า: str.GroupBy(c => c).OrderByDescending(g => g.Count()).First()