共通接頭辞による文字列のチャンクリスト

私は最後の全体の単語に丸められた文字列の最も長い共通接頭辞を抽出する関数を持っています。たとえば、私はリストを持っている:

BRIGGS & STRATTON 290400 
BRIGGS & STRATTON 290700 
BRIGGS & STRATTON 294400 
BRIGGS & STRATTON 294700 

and I call longestPrefix(array); it will return BRIGGS & STRATTON.

私はサブリストに文字列のリストをチャンクし、空でない共通のプレフィックスでグループ化しようとしていますが、私は自分の考えを働かせることはできません。

編集:

サンプルリストは、2つの連続した要素に対して、my関数が空または空でない文字列を返すように生成されます。

ALLIS-CHALMERS 816 
ALLIS-CHALMERS 818 
ALLIS-CHALMERS 917 AND 919 
ARIENS GT-17 
ARIENS GT-18 AND GT-19 
BOLENS 1600 
BOLENS 1700 
BOLENS 1900 HT-18 
BOLENS HT-20 AND HT-23 
BOLENS QT-16 
BRIGGS & STRATTON 290400 
BRIGGS & STRATTON 290700 
2
いいえ。 BRIGGS&STRATTON 29 を返します。
追加された 著者 SLaks,
@Slaks「最後の言葉に丸められた」ので、BRIGGS&STRATTONを返します。
追加された 著者 Nemanja Boric,
@ cardell0、私はGroupBy linq関数で体操をしようとしていますが、私はそれを正しく行う方法がわかりません。
追加された 著者 Nemanja Boric,

1 答え

The value returned by longestPrefix(array) could potentially be different for each non-empty subset of your set. Additionally, each string may belong to multiple "groups", depending on what other items are there in a group: for example, if the original list contained some BRIGGS & SON items, the BRIGGS & STRATTON items could have been grouped with BRIGGS & items as well.

最長の共通接頭辞でグループ化として要件を再定義すると、次のように、対の共通接頭辞を計算し、最長の接頭辞を取得してグループ化することができます。

void AddLongest(IDictionary dict, string s, string p) {
    string current;
    if (!dict.TryGetValue(s, out current) || p.Length > current.Length) {
        dict[s] = p;
    }
}

var longestPrefix = new Dictionary();
for (int i = 0 ; i != myStrings.Length ; i++) {
    for (int j = i+1 ; j != myStrings.Length ; j++) {
        var common = FindLongestPrefix(new[] {myStrings[i], myStrings[j]});
        AddLongest(longestPrefix, myStrings[i], common);
        AddLongest(longestPrefix, myStrings[j], common);
    }
}
// Now you can use LINQ to group by the longest common prefix:
var groups = myStrings.GroupBy(s => longestPrefix[s]);
2
追加された
@ブルゴス私は何が間違っていたか知っていると思う - 私はそれを修正しようと、更新された答えを見てください。
追加された 著者 dasblinkenlight,
@shekkyそれはOPの longestPrefix(array)メソッドです。私は誤って私の辞書を同じ名前と呼んだ。
追加された 著者 dasblinkenlight,
まず、お返事ありがとうございます。コードを実行しようとすると、「指定されたキーが辞書に存在しません」と表示されます。 GroupBy()メソッドの例外?
追加された 著者 Nemanja Boric,
また、今のところlongestPrefixメソッドを配列内で最長の接頭辞を返すように変更しました。
追加された 著者 Nemanja Boric,
ありがとうございました!これは動作します!
追加された 著者 Nemanja Boric,
このコード行は var common = longestPrefix(new [] {m​​yStrings [i]、myStrings [j]}); をコンパイルしません。
追加された 著者 shekky,