我有一个函数可以提取最后一个整个单词的最长公用字符串前缀。例如,如果我有列表:
BRIGGS & STRATTON 290400
BRIGGS & STRATTON 290700
BRIGGS & STRATTON 294400
BRIGGS & STRATTON 294700
我致电longestPrefix(array);
它将返回BRIGGS & STRATTON
。
我正在尝试将字符串列表分组到子列表中,按非空公共前缀分组,但我不能让我的想法发挥作用。
修改
以这种方式生成样本列表,对于两个连续的元素,我的函数返回空或非空字符串:
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
答案 0 :(得分:2)
longestPrefix(array)
返回的值对于您的集合中的每个非空子集可能会有所不同。此外,每个字符串可能属于多个“组”,具体取决于组中的其他项目:例如,如果原始列表包含一些BRIGGS & SON
项,则BRIGGS & STRATTON
项可能已分组还有BRIGGS &
个项目。
如果您将要求重新定义为最长公共前缀的分组,则可以计算成对公共前缀,获取最长的前缀,然后按其分组,如下所示:
void AddLongest(IDictionary<string,string> dict, string s, string p) {
string current;
if (!dict.TryGetValue(s, out current) || p.Length > current.Length) {
dict[s] = p;
}
}
var longestPrefix = new Dictionary<string,string>();
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]);