如果比较这两个解决方案,则第一个解决方案的时间复杂度为O(array-len*sortest-string-len)
,因此您可以将其缩短为O(n*m)
甚至是O(n^2)
。第二个似乎是O(n * log n)
,因为它有一个排序方法,然后比较第一个和最后一个项目,这样它就变成了O(n)
并且对O
没有任何影响。 / p>
但是,比较列表中的字符串项目会发生什么。对整数值列表进行排序是O(n * log n)
,但是我们是否需要比较字符串中的字符才能对其进行排序?因此,如果我说第二个解决方案的时间复杂度是O(n * log n * longest-string-len)
,我错了吗?
此外,由于它在排序时不检查前缀,因此无论如何都会进行排序(大多数情况下),因此其最佳情况远比其他选项差吗?另外,在最坏的情况下,如果考虑到我提到的观点,它仍然会比第一种解决方案更糟糕?
public string longestCommonPrefix(List<string> input) {
if(input.Count == 0) return "";
if(input.Count == 1) return input[0];
var sb = new System.Text.StringBuilder();
for(var charIndex = 0; charIndex < input[0].Length; charIndex++)
{
for(var itemIndex = 1; itemIndex < input.Count; itemIndex++)
{
if(input[itemIndex].Length > charIndex)
return sb.ToString();
if(input[0][charIndex] != input[itemIndex][charIndex])
return sb.ToString();
}
sb.Append(input[0][charIndex]);
}
return sb.ToString();
}
static string longestCommonPrefix(String[] a)
{
int size = a.Length;
/* if size is 0, return empty string */
if (size == 0)
return "";
if (size == 1)
return a[0];
/* sort the array of strings */
Array.Sort(a);
/* find the minimum length from first
and last string */
int end = Math.Min(a[0].Length,
a[size-1].Length);
/* find the common prefix between the
first and last string */
int i = 0;
while (i < end && a[0][i] == a[size-1][i] )
i++;
string pre = a[0].Substring(0, i);
return pre;
}
答案 0 :(得分:1)
首先,除非我遗漏了一些明显的内容,否则第一个方法在O(N * shortest-string-length)
中运行; 最短,而不是最长。
第二,您不能将O(n*m)
减少为O(n^2)
:字符串的数目和长度无关。
最后,您绝对正确。排序确实需要O(n*log(n)*m)
,因此在任何情况下都不会提高性能。
请注意,预先找到最短的字符串可能有益。这将不需要input[itemIndex].Length > charIndex
。