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

โปรแกรม C หาตัวอักษรที่เกิดบ่อยที่สุดใน String (Max Occurrence)

หาตัวอักษร (Character) ที่ปรากฏบ่อยที่สุดในสตริง โดยนับ Frequency ของทุกตัวอักษร ASCII

อัลกอริทึม

  1. สร้าง Array `freq[256]` เก็บจำนวนครั้งของแต่ละ ASCII Code (0-255)
  2. Initialize ทุกค่า = 0
  3. วนอ่าน String ทีละตัว เพิ่ม `freq[(int)ch]++`
  4. หา Index ที่มีค่ามากที่สุด

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

#include <stdio.h>
#include <string.h>

#define SIZE 100
#define CHARS 256

int main() {
    char str[SIZE];
    int freq[CHARS] = {0};  // Initialize all to 0
    int i, maxChar = 0;
    
    printf("Enter string: ");
    fgets(str, SIZE, stdin);
    str[strcspn(str, "\n")] = '\0';  // Remove newline
    
    // Count frequency
    for(i = 0; str[i] != '\0'; i++) {
        unsigned char c = (unsigned char)str[i];
        freq[c]++;
    }
    
    // Find maximum
    for(i = 1; i < CHARS; i++) {
        if(freq[i] > freq[maxChar])
            maxChar = i;
    }
    
    if(freq[maxChar] > 0) {
        printf("Max occurrence: '%c' = %d times\n", maxChar, freq[maxChar]);
    } else {
        printf("Empty string\n");
    }
    
    return 0;
}

ผลลัพธ์

Enter string: tutorials point
Max occurrence: 't' = 3 times

ขยาย: แสดง Frequency ทั้งหมด

printf("\nCharacter Frequencies:\n");
for(i = 0; i < CHARS; i++) {
    if(freq[i] > 0) {
        // แสดงเฉพาะ Printable Characters
        if(i >= 32 && i <= 126)
            printf("'%c' (%3d): %d\n", i, i, freq[i]);
        else
            printf("ASCII %3d: %d\n", i, freq[i]);
    }
}

ผลลัพธ์เพิ่มเติม

Character Frequencies:
' ' ( 32): 1
'i' (105): 2
'l' (108): 1
'n' (110): 1
'o' (111): 2
'p' (112): 1
'r' (114): 1
's' (115): 1
't' (116): 3
'u' (117): 1

กรณีพิเศษ: Tie (หลายตัวเท่ากันมากที่สุด)

// หาทุกตัวที่มี Frequency = Max
int maxFreq = freq[maxChar];
printf("Max frequency = %d, Characters: ", maxFreq);
for(i = 0; i < CHARS; i++) {
    if(freq[i] == maxFreq && freq[i] > 0) {
        if(i >= 32 && i <= 126)
            printf("'%c' ", i);
        else
            printf("[%d] ", i);
    }
}
printf("\n");

ตัวอย่าง Tie

Enter string: aabbcc
Max frequency = 2, Characters: 'a' 'b' 'c'

ความซับซ้อน

  • Time: O(n + k) โดย n = ความยาวสตริง, k = 256 (คงที่)
  • Space: O(1) - Array 256 integers
  • เหมาะกับ ASCII/Extended ASCII
  • Unicode/UTF-8 ต้องใช้ Hash Map หรือ Library

โปรแกรมเวอร์ชันนับเฉพาะ A-Z/a-z (Case Insensitive)

#include <stdio.h>
#include <ctype.h>

int main() {
    char str[100];
    int freq[26] = {0};  // a-z only
    
    printf("Enter string: ");
    fgets(str, 100, stdin);
    
    for(int i = 0; str[i]; i++) {
        if(isalpha(str[i])) {
            freq[tolower(str[i]) - 'a']++;
        }
    }
    
    int maxIdx = 0;
    for(int i = 1; i < 26; i++)
        if(freq[i] > freq[maxIdx]) maxIdx = i;
    
    if(freq[maxIdx] > 0)
        printf("Most frequent letter: '%c' (%d times)\n", 'a' + maxIdx, freq[maxIdx]);
    
    return 0;
}