C++で2つの文字列間の最小編集距離を見つけるプログラム
SとTの2つの単語があるとすると、SからTに変換するために必要な操作の最小数を見つける必要があります。操作には3つのタイプがあります。これらは
- 文字を挿入します
- 文字を削除する
- 文字を置き換えます。
したがって、入力文字列が「評価」および「変動」の場合、結果は5になります。
これを解決するには、次の手順に従います-
-
n:=sのサイズ、m:=tのサイズ、
-
サイズ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
-
-
-
s:=空白スペースと連結s、t:=空白スペースと連結t
-
1からnの範囲のiの場合
-
1からmの範囲のjの場合
-
s[i]がt[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 s, string t) { int n = s.size(); int m =t.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; } } s = " " + s; t = " " + t; for(int i =1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(s[i] !=t[j]){ dp[i][j] = 1+min({dp[i-1][j],dp[i][j-1],dp[i-1][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++で三角形の図心を見つけるプログラム
この問題では、三角形の3つの頂点の座標を示す2D配列が与えられます。私たちのタスクは、C++で三角形のセントロイドを見つけるプログラムを作成することです。 セントロイド 三角形の3つの中央値は、三角形の3つの中央値が交差する点です。 中央値 三角形の頂点は、三角形の頂点とその反対側の線の中心点を結ぶ線です。 問題を理解するために例を見てみましょう 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-3.5, -1) 説明 Centroid (x, y) = ((-3+2.5-3)/3, (1 + 0 - 4)/3) = (-3.5, -1) ソリューションアプロ
-
C++で二分木の2つのノード間の距離を見つける
ノードが少ない二分木があると考えてください。 2つのノードuとvの間の距離を見つける必要があります。ツリーが次のようになっていると仮定します- これで、(4、6)=4の間の距離、パスの長さは4、(5、8)の間の長さ=5などになります。 この問題を解決するために、LCA(Lowest Common Ancestor)を見つけてから、LCAから2つのノードまでの距離を計算します。 例 #include<iostream> using namespace std; class Node { public: in