मान लीजिए कि हमारे पास एक स्ट्रिंग s है, हमें इस स्ट्रिंग को अलग-अलग सबस्ट्रिंग में विभाजित करने के लिए आवश्यक कटों की संख्या ज्ञात करनी होगी और प्रत्येक भाग एक पैलिंड्रोम है। तो अगर स्ट्रिंग "अब्बा" की तरह है, तो इसमें 2 कट लगेंगे। [एबीए|बीबी|ए]
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=स्ट्रिंग s में वर्णों की संख्या
-
आकार n + 1 नामक एक सरणी बनाएं
-
रेस [एन] :=-1
-
मैं के लिए n - 1 से 0 तक की श्रेणी में हूं
-
रेस [i] :=n – i – 1
-
j के लिए i से n तक की श्रेणी में
-
यदि a का, अनुक्रमणिका i से, j – i में स्थानापन्न एक पैलिंड्रोम है, तो
-
रेस [i] :=मिनट का रेस [i] और 1 + रेस [j + 1]
-
-
-
-
रिटर्न रेस[0]
उदाहरण
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string A) {
int left = 0;
int right = A.size()-1;
while(left < right) {
if(A[left] != A[right]) {
return 0;
}
left++;
right--;
}
return 1;
}
int solve(string A) {
int n = A.size();
vector<int>result(n+1);
result[n] = -1;
for(int i=n-1;i>=0;i--) {
result[i] = n-i-1;
for(int j=i;j<n;j++) {
if(isPalindrome(A.substr(i, j-i+1))) {
result[i] = min(result[i], 1 + result[j+1]);
}
}
}
return result[0];
}
class Solution {
public:
int minCut(string s) {
return solve(s);
}
};
main(){
Solution ob;
cout << (ob.minCut("ababba"));
} इनपुट
“ababba”
आउटपुट
2