C++で距離を編集する
word1とword2の2つの単語があるとすると、word1からword2に協調するために必要な操作の最小数を見つける必要があります。操作には、文字の挿入、文字の削除、文字の置換の3種類があります。したがって、入力文字列が「評価」および「変動」の場合、結果は5になります。
これを解決するには、次の手順に従います-
-
n:=w1のサイズ、m:=w2のサイズ、
-
サイズn+1の配列dpを作成します
-
0からnの範囲のiの場合
-
dp [i]:=サイズm+1の新しい配列
-
0からmの範囲のjの場合-
-
dp [i、j]:=0
-
i =0の場合、dp [i、j] =j
-
それ以外の場合、j =0の場合、dp [i、j]:=i
-
-
-
w1:=空白スペースと連結w1、w2:=空白スペースと連結w2
-
1からnの範囲のiの場合
-
1からmの範囲のjの場合
-
w1[i]がw2[j]でない場合、dp [i、j]:=1+最小のdp[i– 1、j]、dp [i、j – 1]、dp [i – 1、j – 1]
-
それ以外の場合、dp [i、j]:=dp [i – 1、j – 1]
-
-
-
dp [n、m]
を返します
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: int minDistance(string w1, string w2) { int n = w1.size(); int m =w2.size(); int** dp = new int*[n+1]; for(int i =0;i<=n;i++){ dp[i] = new int[m+1]; for(int j=0;j<=m;j++){ dp[i][j]=0; if(i==0)dp[i][j]=j; else if(j==0)dp[i][j] = i; } } w1 = " " + w1; w2 = " " + w2; for(int i =1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(w1[i] !=w2[j]){ dp[i][j] = 1+min({dp[i-1][j],dp[i][j-1],dp[i1][j-1]}); } else { dp[i][j] = dp[i-1][j-1]; } } } return dp[n][m]; } }; main(){ Solution ob; cout << (ob.minDistance("fluctuate", "evaluate")); }
入力
"fluctuate" "evaluate"
出力
5
-
C++の二分木のすべてのノード距離K
二分木、ターゲットノード、および1つの値Kがあるとします。ターゲットノードからの距離がKであるすべてのノードの値のリストを見つける必要があります。 したがって、入力がroot =[3,5,1,6,2,0,8、null、null、7,4]、target =5、K =2の場合、出力は[7,4 、1]、これは、ターゲットノードから距離2にあるノードの値が7、4、および1であるためです。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これはノードを取得し、PAはNULLで初期化します。 ノードがnullの場合、- 戻る 親[ノード]:=pa
-
C ++で単項マイナス演算子をオーバーロードしますか?
operatorキーワードは、クラスのインスタンスに適用されたときにoperator-symbolが何を意味するかを指定する関数を宣言します。これにより、演算子に複数の意味が与えられるか、「オーバーロード」されます。コンパイラーは、オペランドのタイプを調べることにより、演算子のさまざまな意味を区別します。 単項演算子は単一のオペランドで動作し、以下は単項演算子の例です- インクリメント(++)およびデクリメント(-)演算子。 単項マイナス(-)演算子。 論理否定(!)演算子。 単項演算子は、呼び出されたオブジェクトを操作します。通常、この演算子は、!obj、-obj、および++ obj