Как получить максимально длинный общий префикс между массивом строк?
Я не имею в виду общий префикс между ними всеми.
Я имею в виду для
АБАК
Абад
AaC
Ава
КОМПАКТ-ДИСК
Куб.см
Я хочу, чтобы рутина дала мне (Аба)
а затем я хочу иметь возможность передать остаток в подпрограмму (без первых двух записей, которые имели этот префикс)
AaC
Ава
КОМПАКТ-ДИСК
Куб.см
И рутина должна дать мне АА
и если я сделаю это снова с предыдущими матчами ommitted (этот список)
КОМПАКТ-ДИСК
Куб.см
подпрограмма должна дать мне с
Вот в чем загвоздка. Список не может быть отсортирован. На самом деле это не струны. Вы можете рассматривать их как строки, но символы можно сравнивать только для==, а не для > или <
по причинам, в которые я мог бы вникнуть, но это функциональное требование. Мне все равно, насколько плохо пройдет операция.
Я приму C#, java или, может быть, javascript, если вы не сойдете с ума от этого и не будете использовать функторные вещи повсюду. Нет линк пожалуйста
Что я уже пробовал:
var groupsStart = new Dictionary<IList<object>, IList<IList<object>>>(OrderedCollectionEqualityComparer<object>.Default); foreach (var flatRule in flatRules) { foreach (var flatRuleCmp in flatRules) { var common = new IList<object>[] { flatRule.Key, flatRuleCmp.Key }.GetCommonPrefix(); if (0 == common.Count) continue; IList<IList<object>> list; if (!groupsStart.TryGetValue(common, out list)) { list = new List<IList<object>>(); groupsStart.Add(common, list); } if(!list.Contains(flatRuleCmp.Key,OrderedCollectionEqualityComparer<object>.Default)) list.Add(flatRuleCmp.Key); } }
Я сказал, что на самом деле это не струны. (но относитесь к ним так и здесь, так как это проще)
В основном я пытался перечислить список и найти общие префиксы, как описано выше, но это не сработало. Это только отчасти сработало. Я продолжаю знать, как это сделать, но затем отключаюсь, когда дело доходит до написания этой вещи. Это был один из таких вечеров.
упс, я думаю, что это может быть так просто. Тестирование
public static IList<T> GetLongestCommonPrefix<T>(this IEnumerable<IList<T>> ss) { IList<T> result = null; foreach(var list in ss) { foreach(var list2 in ss) { if (!ReferenceEquals(list, list2)) { var pfx = GetCommonPrefix<T>(new IList<T>[] { list, list2 }); if (null == result || (null != pfx && pfx.Count > result.Count)) result = pfx; } } } return result; }