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

C++で有効なパリンドロームIII


文字列sと別の数値kがあるとします。指定された文字列がK回文であるかどうかを確認する必要があります。

文字列から最大k文字を削除することで回文に変換できる場合、その文字列はK回文と呼ばれます。

したがって、入力がs ="abcdeca"、k =2のような場合、出力は「b」と「e」の文字を削除することで真になり、回文になります。

これを解決するには、次の手順に従います-

  • 関数lcs()を定義します。これにはs、t、

    が必要です。
  • n:=sのサイズ

  • sの前に1つの空白スペースを追加します

  • tの前に1つの空白スペースを追加します

  • サイズ(n + 1)x(n + 1)の2D配列dpを1つ定義します

  • 初期化i:=1の場合、i <=nの場合、更新(iを1増やします)、実行-

    • 初期化j:=1の場合、j <=nの場合、更新(jを1増やします)、実行-

      • dp [i、j]:=dp [i-1、j]およびdp [i、j-1]の最大値

      • s[i]がt[j]と同じ場合、-

        • dp [i、j]:=最大dp [i、j]および1 + dp [i-1、j-1]

  • dp [n、n]

    を返します
  • メインの方法から、次のようにします-

  • sのサイズでない場合は、-

    • trueを返す

  • x:=空白スペース

  • 初期化i:=sのサイズ、i> =0の場合、更新(iを1つ減らす)、実行-

    • x:=x + s [i]

  • sの戻りサイズ

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int lcs(string s, string t){
      int n = s.size();
      s = " " + s;
      t = " " + t;
      vector<vector<int> > dp(n + 1, vector<int>(n + 1));
      for (int i = 1; i <= n; i++) {
         for (int j = 1; j <= n; j++) {
            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            if (s[i] == t[j])
            dp[i][j] = max(dp[i][j], 1 + dp[i - 1][j - 1]);
         }
      }
      return dp[n][n];
   }
   bool isValidPalindrome(string s, int k) {
      if (!s.size())
      return true;
      string x = "";
      for (int i = s.size() - 1; i >= 0; i--)
         x += s[i];
      return s.size() - lcs(s, x) <= k;
   }
};
main(){
   Solution ob;
   cout << (ob.isValidPalindrome("abcdeca", 2));
}

入力

"abcdeca", 2

出力

1

  1. C++でのK桁のN番目の回文

    k桁のn番目の回文を見つけるには、最初のk桁の番号から、n番目の回文番号が見つかるまで繰り返すことができます。このアプローチは効率的ではありません。自分で試すことができます。 それでは、k桁のn番目の回文を見つけるための効率的なアプローチを見てみましょう。 数字には2つの半分があります。前半は後半の逆に等しい。 k桁のn番目の数字の前半は kが奇数の場合、(n-1)+ 10 k / 2 else(n-1)+10 k / 2-1 k桁のn番目の数値の後半は、前半の桁の逆になります。 kが奇数の場合は、数値の前半の最後の桁を切り捨てます。 アルゴリズム 番号nとkを初期化しま

  2. C++で有効な数独

    数独と呼ばれる9×9のマトリックスを与えたとしましょう。タスクは、指定された数独パターンが有効かどうかを確認することです。 一般的に、数独ボードは次のようになります 数独のルール − すべての行には、1〜9の範囲の数値が含まれています すべての列には、1〜9の範囲の数字が含まれています。 3×3の各ブロックには一意の番号が含まれています。 特定の行に同じ番号を付けることはできません。 特定の列に同じ番号を付けることはできません。 例 入力-1 − sudoku[]=    [["3","5&q