72.編集距離
ハード
二つの言葉を考える WORD1 と WORD2、変換するのに必要な操作の最小数を見つける 単語1を する WORD2を。
あなたは、単語で許可次の3つの操作があります。
- 文字を挿入
- 文字を削除します。
- 文字を交換
例1:
入力:単語1 = "馬"は、WORD2 = "ROS" 出力:3 説明: 馬- > rorse( 'R'で'H'を置き換える) rorse - >( 'r'を除く)バラは バラ- > ROSは(「Eを削除します「)
例2:
入力:単語1 = "意思"、WORD2 = "実行" 出力:5 説明: 意図- > inention( 'T'を除く) inention - > enention( 'i'が'E'で置き換える) enention - > exention(置き換える「N X 'と'') exention - >・実行(置き換える'C'と'N') ・実行- >実行(挿入'' U)が
この質問自体が明確な心を持っています。
まず、二つの主な状況D1に分割[i]を== D2 [j]は、
同等の手段は1を追加しない場合は、距離を追加する必要がない場合は
、このすべてを除いて、あなたはそれを見るたびにあなたはDP [I]を比較する必要があります[J-1]、DP [I-1]〜[J]、DP [I-1]〜[J-1]
最小を選択one.and余分distance.It」を追加することを忘れないでください
全体を考慮することが重要だ画像を。
注意:
裁判官のNULL状況はほとんど実行されている時間と大きなビット空間を減らすことができます(NIPTTnot重要)
する#include <stdio.hに> する#include <iostreamの> する#include < ストリング > の#include <ベクトル> の#include < 設定 > の#include <地図> の#include <アルゴリズム> 使用して 名前空間STD。 クラス解決{ パブリック: INT minDistance(文字列 WORD1、ストリングWORD2){ 場合(word1.empty()|| word2.empty()) { int型 TMP = word1.length() - word2.length()。 戻りABS(TMP);} // ==状況 INT M = word1.length()、N = word2.length()。int型の TMP = 0 ; ベクター <ベクトル< INT >> DP =ベクトル<ベクトル< INT >>(M + 1、ベクトル< INT >(N + 1、0 ))。 以下のために(int型 I = 0 ; + iがm < 1 ; iは++ ) DPを[I] [ 0 ] = I。 用(INT J = 0 ; J <N + 1、J ++ ) DP [ 0] [j]は= jは、 以下のために(int型 i = 1 ; iが<+ M 1 ; iが++ ) { ため(INT J = 1、J <N + 1、J ++ ) { int型、C =(WORD1 [I- 1 ] == WORD2 [J- 1 ])?0:1 。 DP [I] [J] =分(分(DP [I- 1 ] [j]は、DP [I]、[J- 1 ])+ 1、DP [I- 1 ] [J- 1 ] + C)。 } } リターンDP [M] [N]。 } }。 INT メイン() { 溶液S。 // 文字列の単語1 = "意思"; WORD2 = "実行"の文字列。 文字列の単語1 = " 馬"、WORD2 = " ROS " 。 // 文字列S1 =」「; INT RES = s.minDistance(WORD1、WORD2)。 coutの << RES << てendl; リターン 0 ; }