मान लीजिए कि हमारे पास स्ट्रिंग्स की एक सरणी ए है, हमें कोई भी सबसे छोटी स्ट्रिंग ढूंढनी है जिसमें ए में प्रत्येक स्ट्रिंग को सबस्ट्रिंग के रूप में शामिल किया गया हो। हम यह भी मान सकते हैं कि A में कोई स्ट्रिंग A में किसी अन्य स्ट्रिंग को प्रतिस्थापित नहीं कर रही है।
इसलिए, यदि इनपुट ["dbsh",,"dsbbhs",,"hdsb",,"ssdb",,"bshdbsd"] जैसा है, तो आउटपुट "hdsbbhssdbshdbsd"
होगा।इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक फ़ंक्शन कैल्क () को परिभाषित करें, इसमें a, b,
लगेगा -
इनिशियलाइज़ i :=0 के लिए, जब i
-
यदि अनुक्रमणिका i से अंत तक a का प्रतिस्थापन b के प्रारंभ में है, तो -
-
b का वापसी आकार - a + i का आकार
-
-
-
b का वापसी आकार
-
मुख्य विधि से, इन चरणों को करें
-
रिट:=खाली स्ट्रिंग
-
n :=A का आकार
-
आकार n x n के एक 2D सरणी ग्राफ़ को परिभाषित करें -
-
इनिशियलाइज़ j :=0 के लिए, जब j
-
ग्राफ [i, j] :=कैल्क (A[i], A[j])
-
ग्राफ [जे, आई]:=कैल्क (ए [जे], ए [i])
-
-
-
आकार की एक सरणी dp परिभाषित करें:2^n x n.
-
आकार का सरणी पथ परिभाषित करें:2^n x n.
-
minVal :=inf
-
अंतिम :=-1
-
इनिशियलाइज़ करने के लिए मैं :=0, जब i <2^n, अपडेट करें (i से 1 बढ़ाएँ), करें -
-
इनिशियलाइज़ j :=0 के लिए, जब j
-
डीपी [i, जे]:=inf
-
-
-
इनिशियलाइज़ करने के लिए मैं :=0, जब i <2^n, अपडेट करें (i से 1 बढ़ाएँ), करें -
-
इनिशियलाइज़ j :=0 के लिए, जब j
-
अगर i और 2^j गैर-शून्य है, तो
-
पिछला :=मैं ^ (2^j)
-
-
यदि पिछला 0 के समान है, तो -
-
dp[i, j] :=A का आकार[j]
-
-
अन्यथा
-
इनिशियलाइज़ k :=0 के लिए, जब k
-
अगर पिछला और 2^k और df[prev,k] inf नहीं है और df[prev,k] +graph[k,j]
-
डीपी [आई, जे]:=डीपी [पिछला, के] + ग्राफ [के, जे] पी>
-
पथ [i, j] :=k
-
-
-
-
-
अगर मैं 2^n - 1 और dp[i, j]
-
minVal:=dp[i, j]
-
अंतिम:=जे
-
-
-
वक्र :=2^n - 1
-
एक स्टैक सेंट परिभाषित करें
-
जबकि curr> 0, करें -
-
सेंट में अंतिम डालें
-
अस्थायी:=वक्र
-
curr :=curr - (2^last)
-
अंतिम:=पथ [अस्थायी, अंतिम]
-
-
मैं :=सेंट का शीर्ष तत्व
-
सेंट से तत्व हटाएं
-
रिट:=रिट + ए[i]
-
जबकि (सेंट खाली नहीं है), करें -
-
j :=सेंट का शीर्ष तत्व
-
सेंट से तत्व हटाएं
-
रिट:=ए [जे] से (ए [जे] का आकार - ग्राफ [आई, जे] अंत तक) से ए [जे] के सबस्ट्रिंग को जोड़ना
-
मैं :=जे
-
-
वापसी रिट
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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