কম্পিউটার

C++ এ সংক্ষিপ্ততম সুপারস্ট্রিং খুঁজুন


ধরুন আমাদের কাছে স্ট্রিংগুলির একটি অ্যারে রয়েছে, আমাদেরকে একটি সাবস্ট্রিং হিসাবে A-তে প্রতিটি স্ট্রিং ধারণ করে এমন যেকোনো ছোট স্ট্রিং খুঁজে বের করতে হবে। আমরা এটাও ধরে নিতে পারি যে A-এর কোনো স্ট্রিং A-তে অন্য কোনো স্ট্রিংয়ের সাবস্ট্রিং নয়।

সুতরাং, যদি ইনপুটটি ["dbsh","dsbbhs","hdsb","ssdb","bshdbsd"] এর মত হয়, তাহলে আউটপুট হবে "hdsbbhssdbshdbsd"

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int calc(string& a, string& b){
      for (int i = 0; i < a.size(); i++) {
         if (b.find(a.substr(i)) == 0) {
            return b.size() - a.size() + i;
         }
      }
      return (int)b.size();
   }
   string shortestSuperstring(vector<string>& A){
      string ret = "";
      int n = A.size();
      vector<vector<int> > graph(n, vector<int>(n));
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < n; j++) {
            graph[i][j] = calc(A[i], A[j]);
            graph[j][i] = calc(A[j], A[i]);
         }
      }
      int dp[1 << n][n];
      int path[1 << n][n];
      int minVal = INT_MAX;
      int last = -1;
      for (int i = 0; i < (1 << n); i++)
      for (int j = 0; j < n; j++)
      dp[i][j] = INT_MAX;
      for (int i = 1; i < (1 << n); i++) {
         for (int j = 0; j < n; j++) {
            if ((i & (1 << j))) {
               int prev = i ^ (1 << j);
               if (prev == 0) {
                  dp[i][j] = A[j].size();
               } else {
                  for (int k = 0; k < n; k++) {
                     if ((prev & (1 << k)) && dp[prev][k] !=
                     INT_MAX && dp[prev][k] + graph[k][j] < dp[i][j]) {
                        dp[i][j] = dp[prev][k] + graph[k][j];
                        path[i][j] = k;
                     }
                  }
               }
            }
            if (i == (1 << n) - 1 && dp[i][j] < minVal) {
               minVal = dp[i][j];
               last = j;
            }
         }
      }
      int curr = (1 << n) - 1;
      stack<int> st;
      while (curr > 0) {
         st.push(last);
         int temp = curr;
         curr -= (1 << last);
         last = path[temp][last];
      }
      int i = st.top();
      st.pop();
      ret += A[i];
      while (!st.empty()) {
         int j = st.top();
         st.pop();
         ret += (A[j].substr(A[j].size() - graph[i][j]));
         i = j;
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<string> v = {"dbsh","dsbbhs","hdsb","ssdb","bshdbsd"};
   cout << (ob.shortestSuperstring(v));
}

ইনপুট

{"dbsh","dsbbhs","hdsb","ssdb","bshdbsd"}

আউটপুট

hdsbbhssdbshdbsd

  1. C++ এ একটি লাইনের মধ্যবিন্দু খুঁজে বের করার জন্য প্রোগ্রাম

  2. C++ এ ত্রিভুজের সেন্ট্রোয়েড খুঁজে বের করার প্রোগ্রাম

  3. C++ এ একটি পেন্টাগনের এলাকা খুঁজে বের করার প্রোগ্রাম

  4. C++ এ সমান্তরালগ্রামের ক্ষেত্রফল বের করার প্রোগ্রাম