إعطاء سلسلة تحتوي على بعض الأحرف الأبجدية الصغيرة وحرف خاص واحد (.). نحتاج إلى استبدال جميع النقاط ببعض الأحرف الأبجدية بطريقة تجعل السلسلة الناتجة متناظرة في حالة وجود العديد من البدائل المحتملة، نحتاج إلى اختيار سلسلة متناظرة أصغر من الناحية المعجمية. إذا لم يكن من الممكن تحويل السلسلة إلى متناظرة بعد كل الاستبدالات الممكنة، فعندئذٍ يكون الإخراج غير ممكن.
أمثلة:
Input : str = ab..e.c.a Output : abcaeacba The smallest palindrome which can be made after replacement is 'abcaeacba' We replaced first dot with 'c' second dot with 'a' third dot with 'a' and fourth dot with 'b' Input : str = ab..e.c.b Output : Not Possible It is not possible to convert above string into palindrome
يمكننا حل هذه المشكلة على النحو التالي بما أن السلسلة الناتجة يجب أن تكون متناظرة، يمكننا التحقق من زوج من الأحرف غير النقطية في البداية نفسها إذا لم تتطابق، فإن العودة المباشرة غير ممكنة لأنه يمكننا وضع حرف جديد في موضع النقاط فقط وليس في أي مكان آخر.
بعد ذلك، نقوم بالتكرار على أحرف السلسلة إذا كان الحرف الحالي نقطة، ثم نتحقق من الحرف المقترن به (الحرف في الموضع (n - i -1)) إذا كان هذا الحرف أيضًا نقطة، فيمكننا استبدال كلا الحرفين بـ "a" لأن "a" هي أصغر أبجدية صغيرة مما يضمن أصغر سلسلة معجمية في النهاية سيؤدي استبدال كليهما بأي حرف آخر إلى سلسلة متناظرة أكبر من الناحية المعجمية. في حالة أخرى، إذا لم يكن الحرف المقترن نقطة، فيجب علينا استبدال الحرف الحالي بحرفه المقترن لإنشاء سلسلة متناظرة.
So in short If both 'i' and 'n- i- 1' are dot replace them by ‘a’ If one of them is a dot character replace that by other non-dot character
الإجراء أعلاه يعطينا أصغر سلسلة متناظرة من الناحية المعجمية.
تطبيق:
C++// C++ program to get lexicographically smallest // palindrome string #include using namespace std; // Utility method to check str is possible palindrome // after ignoring . bool isPossiblePalindrome(string str) { int n = str.length(); for (int i=0; i<n/2; i++) { /* If both left and right character are not dot and they are not equal also then it is not possible to make this string a palindrome */ if (str[i] != '.' && str[n-i-1] != '.' && str[i] != str[n-i-1]) return false; } return true; } // Returns lexicographically smallest palindrom // string if possible string smallestPalindrome(string str) { if (!isPossiblePalindrome(str)) return 'Not Possible'; int n = str.length(); // loop through character of string for (int i = 0; i < n; i++) { if (str[i] == '.') { // if one of character is dot replace dot // with other character if (str[n - i - 1] != '.') str[i] = str[n - i - 1]; // if both character are dot then replace // them with smallest character 'a' else str[i] = str[n - i - 1] = 'a'; } } // return the result return str; } // Driver code to test above methods int main() { string str = 'ab..e.c.a'; cout << smallestPalindrome(str) << endl; return 0; }
Java // Java program to get lexicographically // smallest palindrome string class GFG { // Utility method to check str is // possible palindrome after ignoring static boolean isPossiblePalindrome(char str[]) { int n = str.length; for (int i = 0; i < n / 2; i++) { /* If both left and right character are not dot and they are not equal also then it is not possible to make this string a palindrome */ if (str[i] != '.' && str[n - i - 1] != '.' && str[i] != str[n - i - 1]) return false; } return true; } // Returns lexicographically smallest // palindrome string if possible static void smallestPalindrome(char str[]) { if (!isPossiblePalindrome(str)) System.out.println('Not Possible'); int n = str.length; // loop through character of string for (int i = 0; i < n; i++) { if (str[i] == '.') { // if one of character is dot // replace dot with other character if (str[n - i - 1] != '.') str[i] = str[n - i - 1]; // if both character are dot // then replace them with // smallest character 'a' else str[i] = str[n - i - 1] = 'a'; } } // return the result for(int i = 0; i < n; i++) System.out.print(str[i] + ''); } // Driver code public static void main(String[] args) { String str = 'ab..e.c.a'; char[] s = str.toCharArray(); smallestPalindrome(s); } } // This code is contributed // by ChitraNayal
Python 3 # Python 3 program to get lexicographically # smallest palindrome string # Utility method to check str is # possible palindrome after ignoring def isPossiblePalindrome(str): n = len(str) for i in range(n // 2): # If both left and right character # are not dot and they are not # equal also then it is not possible # to make this string a palindrome if (str[i] != '.' and str[n - i - 1] != '.' and str[i] != str[n - i - 1]): return False return True # Returns lexicographically smallest # palindrome string if possible def smallestPalindrome(str): if (not isPossiblePalindrome(str)): return 'Not Possible' n = len(str) str = list(str) # loop through character of string for i in range(n): if (str[i] == '.'): # if one of character is dot # replace dot with other character if (str[n - i - 1] != '.'): str[i] = str[n - i - 1] # if both character are dot # then replace them with # smallest character 'a' else: str[i] = str[n - i - 1] = 'a' # return the result return str # Driver code if __name__ == '__main__': str = 'ab..e.c.a' print(''.join(smallestPalindrome(str))) # This code is contributed by ChitraNayal
C# // C# program to get lexicographically // smallest palindrome string using System; public class GFG { // Utility method to check str is // possible palindrome after ignoring static bool isPossiblePalindrome(char []str) { int n = str.Length; for (int i = 0; i < n / 2; i++) { /* If both left and right character are not dot and they are not equal also then it is not possible to make this string a palindrome */ if (str[i] != '.' && str[n - i - 1] != '.' && str[i] != str[n - i - 1]) return false; } return true; } // Returns lexicographically smallest // palindrome string if possible static void smallestPalindrome(char []str) { if (!isPossiblePalindrome(str)) Console.WriteLine('Not Possible'); int n = str.Length; // loop through character of string for (int i = 0; i < n; i++) { if (str[i] == '.') { // if one of character is dot // replace dot with other character if (str[n - i - 1] != '.') str[i] = str[n - i - 1]; // if both character are dot // then replace them with // smallest character 'a' else str[i] = str[n - i - 1] = 'a'; } } // return the result for(int i = 0; i < n; i++) Console.Write(str[i] + ''); } // Driver code public static void Main() { String str = 'ab..e.c.a'; char[] s = str.ToCharArray(); smallestPalindrome(s); } } // This code is contributed by PrinciRaj1992
PHP // PHP program to get lexicographically // smallest palindrome string // Utility method to check str is // possible palindrome after ignoring function isPossiblePalindrome($str) { $n = strlen($str); for ($i = 0; $i < $n / 2; $i++) { /* If both left and right character are not dot and they are not equal also then it is not possible to make this string a palindrome */ if ($str[$i] != '.' && $str[$n - $i - 1] != '.' && $str[$i] != $str[$n - $i - 1]) return false; } return true; } // Returns lexicographically smallest // palindrome string if possible function smallestPalindrome($str) { if (!isPossiblePalindrome($str)) return 'Not Possible'; $n = strlen($str); // loop through character of string for ($i= 0; $i < $n; $i++) { if ($str[$i] == '.') { // if one of character is dot // replace dot with other character if ($str[$n - $i - 1] != '.') $str[$i] = $str[$n - $i - 1]; // if both character are dot // then replace them with // smallest character 'a' else $str[$i] = $str[$n - $i - 1] = 'a'; } } // return the result return $str; } // Driver code $str = 'ab..e.c.a'; echo smallestPalindrome($str); // This code is contributed // by ChitraNayal ?> JavaScript <script> // Javascript program to get lexicographically // smallest palindrome string // Utility method to check str is // possible palindrome after ignoring function isPossiblePalindrome(str) { let n = str.length; for (let i = 0; i < Math.floor(n / 2); i++) { /* If both left and right character are not dot and they are not equal also then it is not possible to make this string a palindrome */ if (str[i] != '.' && str[n - i - 1] != '.' && str[i] != str[n - i - 1]) return false; } return true; } // Returns lexicographically smallest // palindrome string if possible function smallestPalindrome(str) { if (!isPossiblePalindrome(str)) document.write('Not Possible'); let n = str.length; // loop through character of string for (let i = 0; i < n; i++) { if (str[i] == '.') { // if one of character is dot // replace dot with other character if (str[n - i - 1] != '.') str[i] = str[n - i - 1]; // if both character are dot // then replace them with // smallest character 'a' else str[i] = str[n - i - 1] = 'a'; } } // return the result for(let i = 0; i < n; i++) document.write(str[i] + ''); } // Driver code let str='ab..e.c.a'; let s = str.split(''); smallestPalindrome(s); // This code is contributed by rag2127 </script>
الإخراج
abcaeacba
تعقيد الوقت: O(n) حيث n هو طول السلسلة.
تعقيد الفضاء المساعد: O(1)