ভূমিকা
একটি স্ট্রিং দেওয়া থাকলে, তার ক্যারেক্টারগুলোর পজিশন (ইন্ডেক্স) এমনভাবে বিন্যাস করতে হবে যাতে সেটি প্যালিনড্রোম হয়। যদি সম্ভব না হয়, তবে "No palindrome" প্রিন্ট করতে হবে।
প্যালিনড্রোম কী?
প্যালিনড্রোম হলো এমন শব্দ বা ক্যারেক্টার সিকোয়েন্স যা উল্টা পড়লেও একই থাকে, যেমন: MADAM, racecar।
উদাহরণ
ইনপুট: "baa" → আউটপুট: 2 1 3 ইনপুট: "tinni" → আউটপুট: 2 3 1 4 5
এলগরিদম
void printPalindromePos(string &str) শুরু ধাপ ১: প্রতিটি ক্যারেক্টারের পজিশন সংরক্ষণ করার জন্য vectorpos[MAX] ঘোষণা ধাপ ২: n = str.length() ধাপ ৩: i = 0 থেকে n-1 পর্যন্ত লুপ pos[str[i]].push_back(i+1) // 1-ভিত্তিক ইন্ডেক্স লুপ শেষ ধাপ ৪: oddCount = 0, oddChar ঘোষণা ধাপ ৫: i = 0 থেকে MAX-1 পর্যন্ত লুপ যদি pos[i].size() বিজোড় হয়: oddCount++, oddChar = i লুপ শেষ ধাপ ৬: যদি oddCount > 1 হয়: "NO PALINDROME" প্রিন্ট করুন ধাপ ৭: প্রথম অর্ধেকের পজিশন প্রিন্ট করুন ধাপ ৮: বিজোড় ক্যারেক্টারের মাঝপথের পজিশন প্রিন্ট করুন ধাপ ৯: দ্বিতীয় অর্ধেকের পজিশন উল্টা ক্রমে প্রিন্ট করুন শেষ
C++ প্রোগ্রাম উদাহরণ
#includeusing namespace std; const int MAX = 256; void printPalindromePos(string &str) { vector pos[MAX]; int n = str.length(); for (int i = 0; i < n; i++) pos[str[i]].push_back(i + 1); int oddCount = 0; char oddChar; for (int i = 0; i < MAX; i++) { if (pos[i].size() % 2 != 0) { oddCount++; oddChar = i; } } if (oddCount > 1) { cout << "NO PALINDROME"; return; } // প্রথম অর্ধেক for (int i = 0; i < MAX; i++) { int mid = pos[i].size() / 2; for (int j = 0; j < mid; j++) cout << pos[i][j] << " "; } // মাঝপথের বিজোড় ক্যারেক্টার if (oddCount > 0) { int last = pos[oddChar].size() - 1; cout << pos[oddChar][last] << " "; pos[oddChar].pop_back(); } // দ্বিতীয় অর্ধেক (উল্টা ক্রমে) for (int i = MAX - 1; i >= 0; i--) { int count = pos[i].size(); for (int j = count / 2; j < count; j++) cout << pos[i][j] << " "; } } int main() { string s = "tinni"; printPalindromePos(s); return 0; }
আউটপুট
2 3 1 4 5