アルゴリズム:文字列を3つの部分文字列に最適に分割する

emufan4568

しばらくの間、私はこの一見非常に単純な問題に頭を悩ませようとしてきました。文字列kが与えられた場合、その文字列kをk1 + k2 + k3 = kのように正確に3つの部分文字列k1、k2、k3に分割する最適な方法を見つける必要があります。分割は、各部分文字列を逆にしてそれらを結合し直すことによって、辞書式順序で可能な限り最小の結果が得られる場合にのみ最適です。

たとえば、文字列k = "anakonda"を取ります。それを分割する最適な方法は、k1 = "a"、k2 = "na"、k3 = "konda"です。これは、反転後(k1 = "a"、k2 = "an"、k3 = "adnok")、k1 +を取得するためです。 k2 + k3 = "aanadnok"は、辞書式順序で可能な最小の結果です。

私の最初のアプローチは、常に次の辞書式最小文字で部分文字列を終了することでした。

std::string str = "anakonda"

int first = find_min(str, 0, str.size() - 3); // Need to have at least 3 substrings so cannot search to the end
std::reverse(str.begin(), str.begin() + first + 1);

...

ただし、文字列k = "ggggffffa"を指定すると、アルゴリズムが機能しないため、このアプローチには欠陥があります。この問題を正しく解決する方法がわかりません。それで、私はそれを自分で実装しようと試みることができるように理論​​的な解決策を求めています。

アレクセイ・クチキン

このアルゴリズムは問題を解決しますが、最適化が必要になる場合があります。

#include <iostream>
#include <string>

std::string foo(std::string* ss) 
{ 
    std::string res;
    for (int i = 0; i < 3; i++)
        for (int j = ss[i].size()-1; j >= 0; j--) 
        res.push_back(ss[i][j]);
    return res;
}

int main()
{
  std::string s = "ggggffffa";
  std::string res = "";
  for (unsigned int i = 1; i < s.size() - 1; i++)
    for (unsigned int j = 0; j < i; j++)
    {
        std::string ss[3] = {s.substr(0, j+1), s.substr(j+1, i-j), s.substr(i+1)};
        std::string r = foo(ss);
        if (r < res || res == "") res = r;
    }
    std::cout << res << std::endl;  
}

説明:

  1. このようにして、2つのイテレータ(最初の要素から文字列の終わりまでの最初のイテレータ、ゼロ要素から最初のイテレータまでの2番目のイテレータ)を実行して、文字列を分割するためのすべての可能なインデックスを決定します。
for (unsigned int i = 1; i < s.size() - 1; i++)
    for (unsigned int j = 0; j < i; j++)
  1. インデックスi文字列を分割し、文字列jの配列に3つの部分文字列を書き込みます。
std::string ss[3] = {s.substr(0, j+1), s.substr(j+1, i-j), s.substr(i+1)};
  1. foo各部分文字列を逆にし、3つの部分を連結して、結果の文字列を返すすべての関数
  2. fooからの結果の文字列が辞書式に最小であるかどうかを確認してから、結果に新しい文字列を割り当てます。
if (r < res || res == "") res = r;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

最長回文部分文字列問題に対するこのアルゴリズムの時間計算量をさらに削減する方法

分類Dev

制約付きの最長の部分文字列を見つけるための最良のアルゴリズムは何ですか?

分類Dev

文字列内の部分文字列を検索するための高速アルゴリズム

分類Dev

文字列のリスト内の部分文字列に対してより効率的なPythonアルゴリズムを実装する

分類Dev

最長の回文部分文字列を見つけるこのアルゴリズムの時間計算量はどれくらいですか?

分類Dev

KMPアルゴリズムを使用して最長の部分文字列を見つけることは可能ですか?

分類Dev

サブ文字列から文字列を最適化するためのアルゴリズム

分類Dev

接頭辞によって文字列を分割するアルゴリズム

分類Dev

C ++の「マップ」コンテナは、文字列の連続する部分文字列にラビン-カープアルゴリズムを適用しますか?

分類Dev

空の部分文字列に分割する

分類Dev

Javaで文字列を逆にするための最も効率的なアルゴリズムは何ですか?

分類Dev

数万の非常に大きなファイルを含む一種のIDEで使用される高速部分文字列検索アルゴリズム

分類Dev

操作にコストがかかる文字列を構築するためのアルゴリズムの最適化

分類Dev

タイピングの精度を測定するのに最適な文字列距離アルゴリズムはどれですか?

分類Dev

文字列の母音で始まり子音で終わる最小および最大の部分文字列を吐き出すアルゴリズム

分類Dev

JavaScript:部分文字列を分割せずに文字列を分割する

分類Dev

2つの文字列の間の任意の長さの共有部分文字列をすべて検索し、文字列2の出現回数をカウントするためのアルゴリズム?

分類Dev

10進数の文字列をBCDに変換するアルゴリズム

分類Dev

文字列の1つの配列を文字列の多くの配列と比較するアルゴリズム

分類Dev

文字列の1つの配列を文字列の多くの配列と比較するアルゴリズム

分類Dev

配列を最小長と最大長のグループに分割するのに最適なRubyアルゴリズムは何ですか?

分類Dev

文字列を動的な文字数にハッシュするアルゴリズム

分類Dev

文字列を2文字の部分文字列に分割する方法

分類Dev

C#最適化での置換と部分文字列による文字列のフィルタリング

分類Dev

タプルのリストで一致する部分文字列を検索するアルゴリズム的な方法は?

分類Dev

文字列をいくつかの部分文字列に分割します

分類Dev

O(n)時間計算量アルゴリズムを使用して有効な部分文字列の数を見つける方法

分類Dev

部分文字列に基づいてリストを分割する

分類Dev

文字列を部分文字列に分割する

Related 関連記事

  1. 1

    最長回文部分文字列問題に対するこのアルゴリズムの時間計算量をさらに削減する方法

  2. 2

    制約付きの最長の部分文字列を見つけるための最良のアルゴリズムは何ですか?

  3. 3

    文字列内の部分文字列を検索するための高速アルゴリズム

  4. 4

    文字列のリスト内の部分文字列に対してより効率的なPythonアルゴリズムを実装する

  5. 5

    最長の回文部分文字列を見つけるこのアルゴリズムの時間計算量はどれくらいですか?

  6. 6

    KMPアルゴリズムを使用して最長の部分文字列を見つけることは可能ですか?

  7. 7

    サブ文字列から文字列を最適化するためのアルゴリズム

  8. 8

    接頭辞によって文字列を分割するアルゴリズム

  9. 9

    C ++の「マップ」コンテナは、文字列の連続する部分文字列にラビン-カープアルゴリズムを適用しますか?

  10. 10

    空の部分文字列に分割する

  11. 11

    Javaで文字列を逆にするための最も効率的なアルゴリズムは何ですか?

  12. 12

    数万の非常に大きなファイルを含む一種のIDEで使用される高速部分文字列検索アルゴリズム

  13. 13

    操作にコストがかかる文字列を構築するためのアルゴリズムの最適化

  14. 14

    タイピングの精度を測定するのに最適な文字列距離アルゴリズムはどれですか?

  15. 15

    文字列の母音で始まり子音で終わる最小および最大の部分文字列を吐き出すアルゴリズム

  16. 16

    JavaScript:部分文字列を分割せずに文字列を分割する

  17. 17

    2つの文字列の間の任意の長さの共有部分文字列をすべて検索し、文字列2の出現回数をカウントするためのアルゴリズム?

  18. 18

    10進数の文字列をBCDに変換するアルゴリズム

  19. 19

    文字列の1つの配列を文字列の多くの配列と比較するアルゴリズム

  20. 20

    文字列の1つの配列を文字列の多くの配列と比較するアルゴリズム

  21. 21

    配列を最小長と最大長のグループに分割するのに最適なRubyアルゴリズムは何ですか?

  22. 22

    文字列を動的な文字数にハッシュするアルゴリズム

  23. 23

    文字列を2文字の部分文字列に分割する方法

  24. 24

    C#最適化での置換と部分文字列による文字列のフィルタリング

  25. 25

    タプルのリストで一致する部分文字列を検索するアルゴリズム的な方法は?

  26. 26

    文字列をいくつかの部分文字列に分割します

  27. 27

    O(n)時間計算量アルゴリズムを使用して有効な部分文字列の数を見つける方法

  28. 28

    部分文字列に基づいてリストを分割する

  29. 29

    文字列を部分文字列に分割する

ホットタグ

アーカイブ