मान लीजिए कि हमारे पास स्ट्रिंग्स की एक सरणी ए है, हमें कोई भी सबसे छोटी स्ट्रिंग ढूंढनी है जिसमें ए में प्रत्येक स्ट्रिंग को सबस्ट्रिंग के रूप में शामिल किया गया हो। हम यह भी मान सकते हैं कि 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