C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の回文の順列である最大偶数長のサブ文字列


問題の説明

文字列が与えられた場合、タスクは、回文に配置できるサブ文字列の最大長を見つけることです。

入力文字列=“ 5432112356”の場合、最大回文サブストリングは“ 321123”であり、その長さは6であるため、回答は6です。

アルゴリズム

  • 部分文字列の長さが奇数の場合、最終的な解決策では考慮できません。
  • サブ文字列の長さが偶数の場合、そのサブ文字列の各文字が偶数回出現する場合にのみ解決策となる可能性があります。これは、辞書カウントを使用して実行できます。各文字が偶数回出現するかどうかをチェックします。はいの場合、可能な解決策の1つとしてそれを含めます。次に、文字列に次の文字を含めることで次のサブ文字列を形成します。これは、endをインクリメントするだけで実行でき、指定された条件を満たす、可能なすべての最大値を返す、より長いサブ文字列を形成できるかどうかを再帰的にチェックします。ソリューション

#include <bits/stdc++.h>
using namespace std;
unordered_map<int, int> countt;
bool isPalindromePossible(unordered_map<int, int> &countt) {
   for (auto key : countt) {
      if (key.second & 1) {                                                        
         return false;
      }
      return true;
   }
   int getMaxPalindrome(string str, unordered_map<int, int> &countt, int start, int end) {
      if (end == str.length()) {
         if ((end - start) % 2 == 0)
         if (isPalindromePossible(countt))
         return end - start;
         return 0;
      } else {
      if ((end - start) % 2 == 0) {
         if (isPalindromePossible(countt)) {
            countt[str[end]]++;
            return max(end - start, getMaxPalindrome(str, countt, start, end + 1));
         } else {
            countt[str[end]]++;
            return getMaxPalindrome(str, countt, start, end + 1);
         }
      } else {
         countt[str[end]]++;
         unordered_map<int, int>
         c(countt.begin(), countt.end());
         int length = getMaxPalindrome(str, c, start, end + 1);
         countt[str[end]]--;
         countt[str[start]]--;
         return max(length, getMaxPalindrome(str, countt, start + 1, end));
      }
   }
}
int main(int argc, char const *argv[]) {
   string str = "5432112356";
   int start = 0, end = 0;
   cout << "Maximum palindrome length = " << getMaxPalindrome(str, countt, start, end) << endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Maximum palindrome length = 6

  1. C++でグラフの最大値の順列を見つける

    この問題では、N個のノードのグラフが与えられます。私たちのタスクは、変更された配列の最小値の可能な最大値を見つけることです。 グラフの場合、ノードの順列があります。これは、共通のエッジを共有する左側の最小1つのノードを持つ誘導の数です。 問題を理解するために例を見てみましょう Input : N = 4, edge = {{1, 2}, {2, 3}, {3, 4}, {4, 1}} Output : 3 ソリューションアプローチ この問題の簡単な解決策は、1つのノードからツリーをトラバースして、隣接するすべてのノードにアクセスすることです。接続されているノードの数の式を使用して、ノ

  2. C++を使用してN番目の偶数の長さの回文を検索します

    C + +を使用したことがある場合は、回文数について聞いたことがあるはずです。したがって、このガイドでは、適切な例を使用して、「N番目の偶数長の回文」に関するすべてを説明します。回文数は、それらを逆にした後も同じままである数です。数字だけでなく、文字を逆にしてもスペルが変わらない単語。例- 数字={1,121,131,656,1221,1551} 言葉={saas、malayalam、level、mom} 複雑に見えますが、どのシステムでも非常に簡単に実行できます。それでは、回文について簡単に説明しましょう。 N番目の偶数の長さの回文数 11,22,33,44,55,66,77,88