मान लीजिए हमारे पास दो स्ट्रिंग्स s और t हैं। ये दो स्ट्रिंग्स K-समान हैं जब हम s में दो अक्षरों की पोजीशन को स्वैप करके ठीक K बार कर सकते हैं ताकि परिणामी स्ट्रिंग t हो। हमारे पास दो एनाग्राम s और t हैं, और हमें सबसे छोटा K ढूंढना है जिसके लिए s और t K-समान हैं।
उदाहरण के लिए, यदि इनपुट s = "abc", t = "bac" है, तो आउटपुट 1 होगा।
हल करने के चरण
swapp()फ़ंक्शन परिभाषित करें, यह स्ट्रिंगs,i,jलेगा:x := s[i],y := s[j]s[i] := y,s[j] := x
- मुख्य मेथड से निम्नलिखित करें:
- यदि
A == B, तो0वापस करें। - एक सेट
visitedपरिभाषित करें। Aकोvisitedमें डालें।- एक क्यू
qपरिभाषित करें,Aकोqमें डालें। lvl := 1से इनिशियलाइज़ करें, जबqखाली न हो,lvlको 1 से बढ़ाते हुए लूप चलाएं:sz := qका आकारszनॉन-जीरो होने तक, प्रत्येक इटरेशन मेंszको 1 से घटाते हुए व्हाइल लूप चलाएं:curr := qका पहला एलिमेंटqसे एलिमेंट हटाएंi := 0i < curr.size()औरcurr[i] == B[i]तक व्हाइल लूप चलाएं:i++
j := i + 1से इनिशियलाइज़ करें, जबj < curr.size(),j++करते हुए लूप चलाएं:- यदि
curr[i] == curr[j], तो अगले इटरेशन पर जाएं। - यदि
curr[j] != B[i], तो अगले इटरेशन पर जाएं। - यदि
curr[j] == B[j], तो अगले इटरेशन पर जाएं। swapp(curr, i, j)- यदि
curr == B, तोlvlवापस करें। - यदि
visitedमेंcurrनहीं है, तो:currकोvisitedमें डालेंcurrकोqमें डालें
swapp(curr, i, j)
- यदि
-1वापस करें।
- यदि
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
#includeusing namespace std; class Solution { public: int kSimilarity(string A, string B) { if (A == B) return 0; unordered_set visited; visited.insert(A); queue q; q.push(A); for (int lvl = 1; !q.empty(); lvl++) { int sz = q.size(); while (sz--) { string curr = q.front(); q.pop(); int i = 0; while (i < curr.size() && curr[i] == B[i]) i++; for (int j = i + 1; j < curr.size(); j++) { if (curr[i] == curr[j]) continue; if (curr[j] != B[i]) continue; if (curr[j] == B[j]) continue; swapp(curr, i, j); if (curr == B) return lvl; if (!visited.count(curr)) { visited.insert(curr); q.push(curr); } swapp(curr, i, j); } } } return -1; } void swapp(string &s, int i, int j) { char x = s[i]; char y = s[j]; s[i] = y; s[j] = x; } }; int main(){ Solution ob; cout << (ob.kSimilarity("abc", "bac")); }
इनपुट
"abc", "bac"
आउटपुट
1