หาตัวอักษร (Character) ที่ปรากฏบ่อยที่สุดในสตริง โดยนับ Frequency ของทุกตัวอักษร ASCII
อัลกอริทึม
- สร้าง Array `freq[256]` เก็บจำนวนครั้งของแต่ละ ASCII Code (0-255)
- Initialize ทุกค่า = 0
- วนอ่าน String ทีละตัว เพิ่ม `freq[(int)ch]++`
- หา 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;
}