C ++中给定字符串的最大权重转换

问题陈述

给定一个仅包含A和B的字符串。我们可以通过切换任意字符将给定的字符串转换为另一个字符串。因此,给定字符串的许多转换都是可能的。任务是找到最大权重变换的权重。

ing的重量使用以下公式计算-

Weight of string = Weight of total pairs + weight of single characters - Total number of toggles.
  • 仅当两个连续字符不同时,才将它们视为一对。

  • 一对的重量(两个字符都不同)= 4

  • 单个字符的权重= 1

如果输入字符串是-“ AA”,那么输出将是3-

  • 给定字符串的转换为“ AA”,“ AB”,“ BA”和“ BB”。

  • 最大重量转换为“ AB”或“ BA”。权重为“一对-一次切换” = 4-1 = 3。

算法

1. If (n == 1)
   maxWeight(str[0..n-1]) = 1
2. Else If str[0] != str[1]
   maxWeight(str[0..n-1]) = Max (1 + maxWeight(str[1..n-1]), 4 + getMaxRec(str[2..n-1])
3. Elses
   maxWeight(str[0..n-1]) = Max (1 + maxWeight(str[1..n-1]), 3 + getMaxRec(str[2..n-1])

示例

#include<bits/stdc++.h>
using namespace std;
int getMaxRec(string &str, int i, int n, int lookup[]){
   if (i >= n) {
      return 0;
   }
   if (lookup[i] != -1) {
      return lookup[i];
   }
   int ans = 1 + getMaxRec(str, i + 1, n, lookup);
   if (i + 1 < n) {
      if (str[i] != str[i+1]) {
         ans = max(4 + getMaxRec(str, i + 2, n, lookup), ans);
      } else {
         ans = max(3 + getMaxRec(str, i + 2, n, lookup), ans);
      }
   }
   return lookup[i] = ans;
}
int getMaxWeight(string str){
   int n = str.length();
   int lookup[n];
   memset(lookup, -1, sizeof lookup);
   return getMaxRec(str, 0, str.length(), lookup);
}
int main(){
   string str = "AA";
   cout << "Result = " << getMaxWeight(str) << endl;
   return 0;
}

输出结果

当您编译并执行上述程序时。它生成以下输出-

Result = 3