0

私は5つの文字列を持っています、それらを呼びましょう

  • EarthString
  • FireString
  • WindString
  • WaterString
  • HeartString

それらはすべて長さが異なる場合があり、空の場合もあれば、非常に長い場合もあります(ただし、nullになることはありません)。

これらの5つの文字列は非常に良い友達であり、毎週末、このc#ステートメントを使用して結果文字列を形成するために連結されます

ResultString = EarthString + FireString + WindString + WaterString + HeartString

これらの文字列の値によってはResultString、サブ文字列として「キャプテンプラネット」が含まれる場合があります(たまにのみ)。

私の質問は、連結される前に5つの文字列のそれぞれを操作して、それらが結合されたときに「キャプテンプラネット」が結果の文字列にサブ文字列として表示されないようにするにはどうすればよいですか?

私が今考えることができる唯一の方法は、各文字列の各文字を順番に調べることですが、それは非常に面倒なようです。5つの親友の文字列はそれぞれ任意の長さにすることができるため、文字を個別に調べるには、文字を削除する必要があるかどうかを判断する前に、何らかの連結が必要になります。

編集:結果の文字列は、連結された5つの文字列のフィルタリングされたバージョンであり、「キャプテンプラネット」文字列が削除されることを除いて、他のすべてのコンテンツは同じままです。はい、連結前に5つの文字列を操作できるソリューションを探しています。(これは実際、私が直面しているより大きなプログラミング問題を単純化したものです)。みんなありがとう。

4

4 に答える 4

1

事前に連結したい場合は、次のことができます

各文字列の先頭と末尾に、含まれる「CaptainPlanet」の部分に基づいた数値を割り当てます。例: Air = "net the big Captain" の場合、開始値は 3、終了値は 7 になります。2 つの値を安全に連結できるかどうかを判断するには、左側の文字列の末尾 + 右側の文字列の先頭が "CaptainPlanet" の全長と等しくないかどうかを確認します。非常に大きな文字列がある場合、これにより、文字列の最初の x 文字と最後の x 文字だけを調べて、開始/終了値を計算できます。

このソリューションは、 ei air = "Cap" 、 earth ="tain" 、 fire="Planet" などの短い文字列を考慮していません。その場合、「CaptainPlanet」の長さよりも短いトークン用の特別なケースが必要になります。

于 2013-01-28T12:50:19.593 に答える
1

これを行うことができない特定の理由はありますか?

ResultString.Replace("CaptainPlanet", "x"); 
于 2013-01-28T12:41:44.970 に答える
0

元の回答はすべての文字列をクリアしましたが、J.Steen が指摘したように、期待される出力の定式化が既にありました。それでは、行きましょう。

  1. すべての部分文字列で実行elementString.Replace("Captain Planet", "")します。

  2. ここで、各部分文字列で「Captain Planet」のすべての接頭辞/接尾辞を識別し、連結前に処理できるようにその情報を保持する必要があります。つまり、たとえば部分文字列が「Capt」で終わる場合、「部分文字列の末尾に 'Captain Planet' の最初の 4 文字のプレフィックスが含まれている」という情報が必要です。完全な部分文字列の場合も考慮する必要があります (たとえば、文字列の 1 つが "ptain Pla" である場合)。たとえば、接頭辞のいずれかが再帰的または繰り返される場合、問題はさらに複雑になります (たとえば、"CaptainCap" には "CaptainCaptain" の有効な接頭辞が 2 種類含まれており、"apt" は結果の文字列の 2 つの場所で見つかります)。

  3. 結果の文字列が と同じになるように、連結の前にその情報を処理しますResultString.Replace("Captain Planet", "")。おめでとうございます。プログラムを必要以上に複雑にしてしまいました!

しかし要するに、必要な結果 (結合された結果出力を除くすべての部分文字列がそのままの状態) を取得することも、連結ステップの前に完全に処理を行うこともできません。

于 2013-01-28T12:58:34.917 に答える
0

If it doesn't matter how many chars will be dropped, you can remove f.e. all 'C' in all strings.

于 2013-01-28T12:48:09.857 に答える