📜  通过改变最多 K 位来做最大的回文

📅  最后修改于: 2022-05-13 01:57:07.150000             🧑  作者: Mango

通过改变最多 K 位来做最大的回文

给定一个包含所有数字的字符串,我们需要通过最多更改 K 个数字来将此字符串转换为回文。如果可能有许多解决方案,则按字典顺序打印最大的一个。
例子:

Input   : str = “43435”    
          k = 3
Output  : "93939" 
Explanation:
Lexicographically largest palindrome 
after 3 changes is "93939" 

Input :  str = “43435”    
         k = 1
Output : “53435”
Explanation:
Lexicographically largest palindrome 
after 3 changes is “53435”

Input  : str = “12345”    
         k = 1
Output : "Not Possible"
Explanation:
It is not possible to make str palindrome
after 1 change.

方法:

  1. 使用两个指针方法解决此问题。我们从左右开始,如果两个数字不相等,则用较大的值替换较小的值,并将 k 减 1。
  2. top 当左右指针相互交叉时,如果 k 的值为负,则它们停止后,则无法使用 k 更改来生成字符串回文。如果 k 是正数,那么我们可以通过以相同方式从左到右再次循环并将两个数字都转换为 9 并将 k 减 2 来进一步最大化字符串。
  3. 如果 k 值保持为 1 且字符串长度为奇数,则我们将中间字符设为 9 以最大化整个值。
    以下是上述方法的实现:
C++
// C++ program to get largest palindrome changing
// atmost K digits
#include 
using namespace std;
 
// Returns maximum possible
// palindrome using k changes
string maximumPalinUsingKChanges(string str, int k)
{
    string palin = str;
 
    // Initialize l and r by leftmost and
    // rightmost ends
    int l = 0;
    int r = str.length() - 1;
 
    //  first try to make string palindrome
    while (l < r) {
       
        // Replace left and right character by
        // maximum of both
        if (str[l] != str[r]) {
            palin[l] = palin[r] =
                  max(str[l], str[r]);
            k--;
        }
        l++;
        r--;
    }
 
    // If k is negative then we can't make
    // string palindrome
    if (k < 0)
        return "Not possible";
 
    l = 0;
    r = str.length() - 1;
 
    while (l <= r) {
       
        // At mid character, if K>0 then change
        // it to 9
        if (l == r) {
            if (k > 0)
                palin[l] = '9';
        }
 
        // If character at lth (same as rth) is
        // less than 9
        if (palin[l] < '9') {
            /* If none of them is changed in the
               previous loop then subtract 2 from K
               and convert both to 9 */
            if (k >= 2 && palin[l] == str[l]
                && palin[r] == str[r]) {
                k -= 2;
                palin[l] = palin[r] = '9';
            }
 
            /*  If one of them is changed
                in the previous
                loop then subtract 1 from K
                (1 more is
                subtracted already) and make them 9  */
            else if (k >= 1
                     && (palin[l] != str[l]
                         || palin[r] != str[r])) {
                k--;
                palin[l] = palin[r] = '9';
            }
        }
        l++;
        r--;
    }
 
    return palin;
}
 
//  Driver code to test above methods
int main()
{
    string str = "43435";
    int k = 3;
    cout << maximumPalinUsingKChanges(str, k);
    return 0;
}


Java
// Java program to get largest palindrome changing
// atmost K digits
 
import java.text.ParseException;
 
class GFG {
 
  // Returns maximum possible
  // palindrome using k changes
  static String maximumPalinUsingKChanges(String str,
                                          int k)
  {
    char palin[] = str.toCharArray();
    String ans = "";
 
    // Initialize l and r by leftmost and
    // rightmost ends
    int l = 0;
    int r = str.length() - 1;
 
    // First try to make String palindrome
    while (l < r) {
 
      // Replace left and right character by
      // maximum of both
      if (str.charAt(l) != str.charAt(r)) {
        palin[l] = palin[r] = (char)Math.max(
          str.charAt(l), str.charAt(r));
        k--;
      }
      l++;
      r--;
    }
 
    // If k is negative then we can't make
    // String palindrome
    if (k < 0) {
      return "Not possible";
    }
 
    l = 0;
    r = str.length() - 1;
 
    while (l <= r) {
 
      // At mid character, if K>0 then change
      // it to 9
      if (l == r) {
        if (k > 0) {
          palin[l] = '9';
        }
      }
 
      // If character at lth (same as rth) is
      // less than 9
      if (palin[l] < '9') {
 
        /* If none of them is changed in the
            previous loop then subtract 2 from K
            and convert both to 9 */
        if (k >= 2 && palin[l] == str.charAt(l)
            && palin[r] == str.charAt(r)) {
          k -= 2;
          palin[l] = palin[r] = '9';
        }
 
        /* If one of them is changed in the
        previous loop then subtract
        1 from K (1 more
        is subtracted already) and make them 9 */
        else if (k >= 1
                 && (palin[l] != str.charAt(l)
                     || palin[r]
                     != str.charAt(r))) {
          k--;
          palin[l] = palin[r] = '9';
        }
      }
      l++;
      r--;
    }
    for (int i = 0; i < palin.length; i++)
      ans += palin[i];
    return ans;
  }
 
  // Driver code to test above methods
  public static void main(String[] args)
    throws ParseException
  {
    String str = "43435";
    int k = 3;
    System.out.println(
      maximumPalinUsingKChanges(str, k));
  }
}
// This code is contributed by 29ajaykumar


C#
// C# program to get largest palindrome changing
// atmost K digits
 
using System;
public class GFG {
 
  // Returns maximum possible
  // palindrome using k changes
  static String maximumPalinUsingKChanges(String str,
                                          int k)
  {
    char[] palin = str.ToCharArray();
    String ans = "";
     
    // Initialize l and r by leftmost and
    // rightmost ends
    int l = 0;
    int r = str.Length - 1;
 
    // First try to make String palindrome
    while (l < r) {
       
      // Replace left and right character by
      // maximum of both
      if (str[l] != str[r]) {
        palin[l] = palin[r]
          = (char)Math.Max(str[l], str[r]);
        k--;
      }
      l++;
      r--;
    }
 
    // If k is negative then we can't make
    // String palindrome
    if (k < 0) {
      return "Not possible";
    }
 
    l = 0;
    r = str.Length - 1;
 
    while (l <= r) {
       
      // At mid character, if K>0 then change
      // it to 9
      if (l == r) {
        if (k > 0) {
          palin[l] = '9';
        }
      }
 
      // If character at lth (same as rth) is
      // less than 9
      if (palin[l] < '9') {
         
        /* If none of them is changed in the
        previous loop then subtract 2 from K
        and convert both to 9 */
        if (k >= 2 && palin[l] == str[l]
            && palin[r] == str[r]) {
          k -= 2;
          palin[l] = palin[r] = '9';
        }
         
        /* If one of them is changed in the
        previous loop then subtract 1 from K (1 more
        is subtracted already) and make them 9 */
        else if (k >= 1
                 && (palin[l] != str[l]
                     || palin[r] != str[r])) {
          k--;
          palin[l] = palin[r] = '9';
        }
      }
      l++;
      r--;
    }
    for (int i = 0; i < palin.Length; i++)
      ans += palin[i];
    return ans;
  }
 
  // Driver code to test above methods
  public static void Main()
  {
    String str = "43435";
    int k = 3;
    Console.Write(maximumPalinUsingKChanges(str, k));
  }
}
// This code is contributed by Rajput-Ji


Python
# Python3 program to get largest palindrome changing
# atmost K digits
 
# Returns maximum possible
# palindrome using k changes
def maximumPalinUsingKChanges(strr, k):
    palin = strr[::]
 
    # Initialize l and r by leftmost and
    # rightmost ends
    l = 0
    r = len(strr) - 1
 
    # first try to make palindrome
    while (l <= r):
 
        # Replace left and right character by
        # maximum of both
        if (strr[l] != strr[r]):
            palin[l] = palin[r] =
                   max(strr[l], strr[r])
 
            # print(strr[l],strr[r])
            k -= 1
        l += 1
        r -= 1
 
    # If k is negative then we can't make
    # palindrome
    if (k < 0):
        return "Not possible"
 
    l = 0
    r = len(strr) - 1
 
    while (l <= r):
 
        # At mid character, if K>0 then change
        # it to 9
        if (l == r):
            if (k > 0):
                palin[l] = '9'
 
        # If character at lth (same as rth) is
        # less than 9
        if (palin[l] < '9'):
 
            # If none of them is changed in the
            # previous loop then subtract 2 from K
            # and convert both to 9
            if (k >= 2 and palin[l] == strr[l] and
                           palin[r] == strr[r]):
                k -= 2
                palin[l] = palin[r] = '9'
 
            # If one of them is changed in the previous
            # loop then subtract 1 from K (1 more is
            # subtracted already) and make them 9
            elif (k >= 1 and (palin[l] != strr[l] or
                              palin[r] != strr[r])):
                k -= 1
                palin[l] = palin[r] = '9'
 
        l += 1
        r -= 1
 
    return palin
 
 
# Driver code
st = "43435"
strr = [i for i in st]
k = 3
a = maximumPalinUsingKChanges(strr, k)
print("".join(a))
 
# This code is contributed by mohit kumar 29


Javascript


输出:

93939