0

文字列で置き換える必要がある文字列のマップ (ペアのコレクション) があります。

たとえば{ {"foo", "foo2"}, {"bar", "bar2"} } 、文字列の最終結果をマップした場合、次のように"foo barman football bar"なります"foo2 bar2man foo2tball bar2"

すでに多くの質問/回答がありますが、ここでの最大の問題について言及しているものはありません。マップに「循環」置換がある場合{ {"foo", "bar"}, {"bar", "foo"} } 、結果は次のようになります"bar fooman bartball foo"

別の問題が考えられます{ {"foo", "fo"}, {"fo", "f"} }

アルゴリズムは、インスタンスを 1 回だけ置換する必要があります。

SSCCE を提供できなくて申し訳ありません...私はまだそれにアプローチする方法を探しています。


オプション1:

マップをキー サイズ (降順) で並べ替えます。これにより、包含の問題が解消されます。

次に、従来のスワップ アプローチに由来するアイデアに基づきます。マップを調べて、出現するすべてのキーを一意のものに置き換えます。私の場合、2番目のキーなどの最初のキーには?使用できませんでした。?1?2

2 番目のパス?1では、値 1、?2値 2 などに置き換えます。

短所: 1. どのキーまたは値とも一致しないスワップ キーを定義する簡単な方法が必要です。2.パフォーマンスが高価に見える

オプション 2:

と言う一般的な一致パターンを作成します((key1|key2|key3...)(.*?))*。一致を列挙し、キーが一致するたびにキーを値に置き換えます。結果を再生成します。

短所: 1. マッチング ツリーの作成にメモリがかかる可能性がある 2. 一般的なパターンの準備が面倒になる可能性がある

4

0 に答える 0