honey the codewitch Ответов: 1

Как получить максимально длинный общий префикс между массивом строк?


Я не имею в виду общий префикс между ними всеми.

Я имею в виду для

АБАК
Абад
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;
}

1 Ответов

Рейтинг:
8

honey the codewitch

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;
}