使用排序查找最长公共前缀的 C++ 程序
问题陈述:给定一组字符串,找到最长的公共前缀。
例子:
Input: {"geeksforgeeks", "geeks", "geek", "geezer"}
Output: "gee"
Input: {"apple", "ape", "april"}
Output: "ap"
字符串数组的最长公共前缀是两个最不相似的字符串之间的公共前缀。例如,在给定的数组 {“apple”, “ape”, “zebra”} 中,没有公共前缀,因为数组 “ape” 和 “zebra” 的 2 个最不相似的字符串不共享任何起始字符。
我们在下面的帖子中讨论了五种不同的方法。
- 逐字匹配
- 字符字符
- 分而治之
- 二进制搜索。
- 使用特里)
在这篇文章中,我们讨论了一种基于排序的新方法。这个想法是对字符串数组进行排序,并找到排序数组的第一个和最后一个字符串的公共前缀。
C++
// C++ program to find longest common prefix
// of given array of words.
#include
#include
using namespace std;
// Function to find the longest common prefix
string longestCommonPrefix(string ar[], int n)
{
// If size is 0, return empty string
if (n == 0)
return "";
if (n == 1)
return ar[0];
// Sort the given array
sort(ar, ar + n);
// Find the minimum length from
// first and last string
int en = min(ar[0].size(),
ar[n - 1].size());
// Now the common prefix in first and
// last string is the longest common prefix
string first = ar[0], last = ar[n - 1];
int i = 0;
while (i < en && first[i] == last[i])
i++;
string pre = first.substr(0, i);
return pre;
}
// Driver Code
int main()
{
string ar[] = {"geeksforgeeks", "geeks",
"geek", "geezer"};
int n = sizeof(ar) / sizeof(ar[0]);
cout << "The longest common prefix is: "
<< longestCommonPrefix(ar, n);
return 0;
}
// This code is contributed by jrolofmeister
输出:
The longest common prefix is : gee
时间复杂度: O(MAX * n * log n) 其中 n 是数组中的字符串数,MAX 是任何字符串中的最大字符数。请注意,两个字符串的比较最多需要 O(MAX) 时间,对于 n 个字符串的排序,我们需要 O(MAX * n * log n) 时间。
有关更多详细信息,请参阅有关使用排序的最长公共前缀的完整文章!