4


0

指定されたセットのすべての文字を含む単語の最短の組み合わせを見つける

本当に巨大な単語(「犬」、「魚」、「走る」、「プログラミング」など)の配列(a1と呼びましょう)を取得しました。

a1の任意の単語を他の単語と組み合わせることができます(例: 「dog」と「programming」を組み合わせて「dog-programming」にすることができます)、文字列が本当に大きくなるまで何度も繰り返します。

文字列(「de」、「s」、「x?」、「umh」などの文字列の配列(a2と呼びましょう)を取得しました。これらはほぼ何でもかまいません)。 a1のどのストリングにも見つからないストリングがa2にないことが保証されています。

私が探しているのは、a2内のすべての文字列を含む最短文字列(文字列に含まれる文字数ではなく、その文字列を作成するのに必要な組み合わせの数で最短)です。 すべてがその最小の長さを特徴とする文字列が複数ある場合は、どれかを選んでプログラムから脱出できます。

配列が比較的小さい場合でも、単語を組み合わせる実質的に無限のオプションがあるので、私はこれを総当たり攻撃することはできないと思いますが、間違っていることを証明したいと思います!

確実に最短の結果をもたらす最短の文字列を取得するための良い方法はありますか、または非常に短い文字列を検索するためにヒューリスティックアルゴリズムを使用する必要がありますか?

編集:a2からほとんどの文字列をカバーするa1から文字列を選択し、a2からそれらの項目を削除して、もう一度開始しようとしましたが、動作しません! かなり良い結果が得られますが、最良ではありません。

1 Answer


3


あなたの例のように単語をダッシュ​​と組み合わせた場合、例えば

dog + programming + sky = dog-programming-sky

AND A2の単語にダッシュが含まれていない場合、それは偽装された単なるSET-COVERであり、NP完全最適化の問題です。 その後、SET-COVERで利用可能なソリューション戦略を使用して問題を解決できます。 SET-COVERには高速な近似アルゴリズムがありますが、絶対最小のソリューションが必要な場合は、最悪の指数アルゴリズムに頼る必要があります。

ダッシュなしで単語を組み合わせた場合、例えば

dog + programming + sky = dogprogrammingsky

問題はより困難です 「ogpro」は、構成文字列のサブストリングではない場合でも、結合された単語に含まれています。