কম্পিউটার টিউটোরিয়াল

C++-এ সব স্ট্রিং সমান করার মিনিমাম মুভ-টু-এন্ড অপারেশন


সমস্যা বিবরণ

nটি স্ট্রিং দেওয়া আছে যা একে অপরের পারমিউটেশন। আমাদের সব স্ট্রিংকে সমান করতে হবে একটি অপারেশন দিয়ে যেটি যেকোনো স্ট্রিং-এর ফার্স্ট ক্যারেক্টারকে এন্ডে মুভ করে।

উদাহরণ

যদি arr[] = {"abcd", "cdab"} হয়, তবে ২ মুভ দরকার।

  • প্রথম স্ট্রিং "abcd" নিন। ক্যারেক্টার 'a' কে এন্ডে মুভ করুন। অপারেশনের পর স্ট্রিং হয়ে যায় "bcda"
  • এখন ক্যারেক্টার 'b' কে এন্ডে মুভ করুন। অপারেশনের পর স্ট্রিং হয়ে যায় "cdab"। যা দুটি স্ট্রিংকে সমান করে দেয়।

অ্যালগরিদম

  • প্রথম স্ট্রিং নিন। এটিকে 'str1' বলুন।
  • একটি টেম্প স্ট্রিং বানান str1 কে str1-সহ কনক্যাট করে: temp = str1 + str1
  • অন্য স্ট্রিংগুলোকে কারেন্ট টার্গেট সমান করার জন্য রিকোয়ার্ড রোটেশন কাউন্ট করুন
  • উপরের স্টেপগুলো সব স্ট্রিংয়ের জন্য রিপিট করুন এবং সব কাউন্টের মিনিমাম রিটার্ন করুন।

উদাহরণ

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <climits> 
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0])) 
using namespace std; 

int minMoves(string str[], int n) { 
    int minCnt = INT_MAX; 
    for (int i = 0; i < n; ++i) { 
        int cnt = 0; 
        for (int j = 0; j < n; ++j) { 
            string temp = str[j] + str[j]; 
            int index = temp.find(str[i]); 
            if (index != string::npos) { 
                cnt += index; 
            } 
        } 
        minCnt = min(cnt, minCnt); 
    } 
    return minCnt; 
} 

int main() { 
    string str[] = {"abcd", "cdab", "bacd", "cdba"}; 
    cout << "Minimum moves: " << minMoves(str, SIZE(str)) << endl; 
    return 0; 
}

আউটপুট

যখন আপনি উপরের প্রোগ্রাম কম্পাইল ও এক্সিকিউট করবেন। এটি নিচের আউটপুট জেনারেট করবে:

Minimum moves: 2

  1. C++ ব্যবহার করে অ্যারের সব এলিমেন্ট সমান করতে ন্যূনতম মুভ সংখ্যা

  2. C++ ব্যবহার করে দুটি স্ট্রিং সমান করার ন্যূনতম অপারেশন সংখ্যা

  3. C++ ব্যবহার করে স্ট্রিংকে প্যালিনড্রোম করার ন্যূনতম ডিলিশন সংখ্যা

  4. C++-এ অ্যারের সব এলিমেন্ট একই করার জন্য ন্যূনতম ডিলিট অপারেশন