Это задача называется Longest common prefix
, решить её можно следующим образом:
public string LongestCommonPrefix(string[] strs)
{
if (strs == null || strs.Length == 0)
return "";
return CommonPrefix(strs, 0, strs.Length - 1);
}
private string CommonPrefix(string[] strs, int start, int end)
{
if (start == end)
return strs[start];
int middle = (start + end) / 2;
var left = CommonPrefix(strs, start, middle);
var right = CommonPrefix(strs, middle + 1, end);
return ConquerString(left, right);
}
private string ConquerString(string left, string right)
{
int currentSmallest = Math.Min(left.Length, right.Length);
for (int i = 0; i < currentSmallest; i++)
{
if (left[i] != right[i])
return left.Substring(0, i);
}
return left.Substring(0, currentSmallest);
}
Разбор этой задачи с построением дерева вызовов можете найти на просторах ютуба, алгоритм довольно простой если его визуализировать. Работает алгоритм только если гарантированно у всех элементов массива есть одинаковый префикс