ধরুন আমাদের একটি স্ট্রিং আছে। আমাদের স্ট্রিংয়ের প্রতিটি ক্যারেক্টারের ASCII ভ্যালুর যোগফল ন্যূনতম করতে হবে, একটি নির্দিষ্ট ক্যারেক্টারের সব ঘটনা মুছে ফেলার পর। ধরুন স্ট্রিং "hello" দিয়ে আছে, ASCII যোগফল = (104 + 101 + 108 + 108 + 111) = 532। এখন প্রতিটি ক্যারেক্টারের ঘটনা চেক করুন:
- h একবার হয়েছে, খরচ 1 * 104 = 104
- e একবার হয়েছে, খরচ 1 * 101 = 101
- l দুবার হয়েছে, খরচ 2 * 108 = 216
- o একবার হয়েছে, খরচ 1 * 111 = 111
এখানে l সবচেয়ে বেশি বার হয়েছে, তাই l-এর সব ঘটনা মুছে ফেললে ভ্যালু ন্যূনতম হবে। আসলে আমরা উপরের লিস্ট থেকে সর্বোচ্চ মানটি বাদ দিচ্ছি। ফাইনাল রেজাল্ট = 532 - 216 = 316।
লজিকটি সহজ: প্রথমে স্ট্রিংয়ের ASCII যোগফল বের করুন। তারপর প্রতিটি ক্যারেক্টারের ফ্রিকোয়েন্সি কাউন্ট করুন, তারপর সেই ক্যারেক্টারটি রিমুভ করুন যা occurrence * ASCII ভ্যালু হিসেবে সর্বোচ্চ অবদান রেখেছে। বাদ দেওয়া মানটিই রেজাল্ট।
উদাহরণ
#include <iostream> using namespace std; int minASCIISum(string str, int len) { int max_val = INT_MIN, sum = 0; int frequency[26] = { 0 }; for (int i = 0; i < len; i++) { frequency[str[i] - 'a']++; sum += (int)str[i]; } for (int i = 0; i < 26; i++) max_val = max(max_val, frequency[i] * (i + 'a')); return (sum - max_val); } int main() { string str = "hello"; int n = str.length(); cout << "Minimized Sum: " << minASCIISum(str, n); }আউটপুট
Minimized Sum: 316