স্ট্রিংয়ে সবচেয়ে বেশি বার আবির্ভূত হওয়া ক্যারেক্টার (Most Frequent Character) বের করার জন্য ফ্রিকোয়েন্সি কাউন্টিং টেকনিক ব্যবহার করা হয়।
অ্যালগরিদম
- একটি ফ্রিকোয়েন্সি অ্যারে/ডিকশনারি তৈরি করুন
- স্ট্রিংয়ের প্রতিটি ক্যারেক্টার için কাউন্ট বাড়ান
- সর্বোচ্চ কাউন্ট वाला ক্যারেক্টার খুঁজুন
সম্পূর্ণ উদাহরণ (অ্যারে ব্যবহার - ASCII)
using System;
class Demo
{
static int MAX_CHARS = 256;
static void CalculateFrequency(string s, int[] freq)
{
for (int i = 0; i < s.Length; i++)
freq[s[i]]++;
}
public static void Main()
{
string s = "thisisit!";
int[] freq = new int[MAX_CHARS];
CalculateFrequency(s, freq);
// সর্বাধিক ফ্রিকোয়েন্সি খুঁজুন
int maxFreq = 0;
char maxChar = '\0';
for (int i = 0; i < MAX_CHARS; i++)
{
if (freq[i] > maxFreq)
{
maxFreq = freq[i];
maxChar = (char)i;
}
}
Console.WriteLine($"স্ট্রিং: \"{s}\"");
Console.WriteLine($"সর্বাধিক ফ্রিকোয়েন্সি: '{maxChar}' ({maxFreq} বার)");
// সব ফ্রিকোয়েন্সি দেখান
Console.WriteLine("\nসব ক্যারেক্টার ফ্রিকোয়েন্সি:");
for (int i = 0; i < MAX_CHARS; i++)
{
if (freq[i] > 0)
Console.WriteLine($"'{((char)i)}': {freq[i]}");
}
}
}
আউটপুট
স্ট্রিং: "thisisit!"
সর্বাধিক ফ্রিকোয়েন্সি: 'i' (3 বার)
সব ক্যারেক্টার ফ্রিকোয়েন্সি:
't': 2
'h': 1
'i': 3
's': 2
'!': 1
LINQ ব্যবহার করে সংক্ষিপ্ত সমাধান
using System.Linq;
string s = "thisisit!";
var mostFrequent = s.GroupBy(c => c)
.OrderByDescending(g => g.Count())
.First();
Console.WriteLine($"সর্বাধিক: '{mostFrequent.Key}' ({mostFrequent.Count()} বার)");
// সব ফ্রিকোয়েন্সি
var allFreq = s.GroupBy(c => c)
.Select(g => new { Char = g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
foreach (var x in allFreq)
Console.WriteLine($"'{x.Char}': {x.Count}");
ইউনিকোড সাপোর্ট (Dictionary)
using System.Collections.Generic;
string s = "হ্যালো ওয়ার্ল্ড! 🌍";
var freq = new Dictionary<char, int>();
foreach (char c in s)
{
if (freq.ContainsKey(c)) freq[c]++;
else freq[c] = 1;
}
var max = freq.OrderByDescending(kvp => kvp.Value).First();
Console.WriteLine($"সর্বাধিক: '{max.Key}' ({max.Value} বার)");
এজ কেস হ্যান্ডলিং
public static (char Char, int Count) GetMostFrequentChar(string input)
{
if (string.IsNullOrEmpty(input))
throw new ArgumentException("ইনপুট স্ট্রিং খালি");
var freq = new Dictionary<char, int>();
foreach (char c in input)
{
freq[c] = freq.GetValueOrDefault(c) + 1;
}
// টাই ব্রেক: প্রথমে আসা ক্যারেক্টার বেছে নিন
return freq.Aggregate((max, current) =>
current.Value > max.Value ? current : max);
}
পারফরম্যান্স তুলনা
| পদ্ধতি | টাইম | স্পেস | ব্যবহার |
|---|---|---|---|
| int[256] অ্যারে | O(n) - দ্রুততম | O(1) | ASCII only |
| Dictionary<char,int> | O(n) | O(k) | ইউনিকোড, সাধারণ |
| LINQ GroupBy | O(n log k) | O(k) | পঠনীয়, প্রোটোটাইপিং |
সারসংক্ষেপ
- ASCII only, পারফরম্যান্স Криটিক্যাল: `int[256]` অ্যারে
- সাধারণ ব্যবহার (ইউনিকোড): `Dictionary
` - সংক্ষিপ্ত কোড: LINQ `GroupBy` + `OrderByDescending` + `First`
- টাই ব্রেকিং: `Aggregate` বা কাস্টম লজিক ব্যবহার করুন