2011-01-28 10 views
1

私の問題は、2つの文字列s1、s2の共通部分文字列を返したいということです。明らかに、s1とs2は対称です。パラメータのコピーまたは参照を作成しますか?

string shortest_common(const string& s1, const string& s2) { 

} 

あり、私が思いついたこの問題には3つの可能な解決策です:

  • はどちらか、私はそれに対応する定数を犠牲にしなければならないことを意味する、
  • S1、S2のコピーを作成したり、それらを交換します-ness
  • 最悪の場合、重複コード!

個人的には、s1またはs2を変更しない最短の共通文字列を見つけることを意図しているので、最初のケースが個人的に好きです。だから私の質問です:どのオプションはこの場合理想的ですか?

おかげで、
チャン

+0

彼らは対称的な意味のパリンドロームですか?のように、 'abba'と 'cabbac'は有効な入力で、 'abba'が結果になりますか? – mkb

+5

待ち、最短の共通の文字列ですか?答えは常に ""なのでそれは面白くない。:) – mkb

+0

@Matt Kane:それは改変版であり、伝統的なパリンドロームではない。それは私が扱わなければならない多くのサブケースを持っています。 – Chan

答えて

2

は、私はあなたが表示されてきた署名を使用して行くことを選ぶでしょう。共通の部分文字列を見つけたら、副作用を持つことは望ましくありません。それはあなたの機能を呼び出すときに人々が考えるものではありません。私は、 "add_two_numbers"という関数が数値の1つを修正して値を返すとは期待していません。

+0

あなたの考えは私と一致しました;)。私はこのオプションのために行くでしょう。 – Chan

0

どのような方法でもオブジェクト自体を変更することなく、パラメータの意味を入れ替えるために再帰を使用できます。

+0

Ben Voigt:ありがとう! – Chan

0

あなたの実際の質問はちょっと混乱しているので、私はタイトルで判断します。

は、両方の操作を行います。

void shortest_common(string& s1, const string& s2) 
{ 
    // real algorithm changing s1 
} 

inline string shortest_common(string s1, const string& s2) 
{ 
    shortest_common(s1, s2); 
    return s1; 
} 
+0

@sbi:解決に感謝します。 – Chan

+0

@sbi:パラメータをコピーするだけの場合は、値渡しを使用してコピーを作成する方がいいですか?実際の実装ではrvalue-referenceを使用し、フォワーダは 'std :: move'を使用します) –

+0

@Ben:あなたは正しいですが、 – sbi

関連する問題