给定一组字符串,找到最长的公共前缀。
例子:
Input : {“geeksforgeeks”, “geeks”, “geek”, “geezer”}
Output : "gee"
Input : {"apple", "ape", "april"}
Output : "ap"
我们通过字符匹配算法讨论了词匹配和字符。
在该算法中,讨论了分而治之的方法。我们首先将字符串数组分为两部分。然后,我们对左侧部分执行相同的操作,之后对右侧部分执行相同的操作。我们将一直这样做,直到并且除非所有字符串的长度都为1。现在,在此之后,我们将通过返回左右字符串的公共前缀来开始进行征服。
使用下图将使算法清晰明了。我们将字符串视为–“ geeksforgeeks”,“ geeks”,“ geek”,“ geezer”
下面是实现。
C++
// A C++ Program to find the longest common prefix
#include
using namespace std;
// A Utility Function to find the common prefix between
// strings- str1 and str2
string commonPrefixUtil(string str1, string str2)
{
string result;
int n1 = str1.length(), n2 = str2.length();
for (int i=0, j=0; i<=n1-1&&j<=n2-1; i++,j++)
{
if (str1[i] != str2[j])
break;
result.push_back(str1[i]);
}
return (result);
}
// A Divide and Conquer based function to find the
// longest common prefix. This is similar to the
// merge sort technique
string commonPrefix(string arr[], int low, int high)
{
if (low == high)
return (arr[low]);
if (high > low)
{
// Same as (low + high)/2, but avoids overflow for
// large low and high
int mid = low + (high - low) / 2;
string str1 = commonPrefix(arr, low, mid);
string str2 = commonPrefix(arr, mid+1, high);
return (commonPrefixUtil(str1, str2));
}
}
// Driver program to test above function
int main()
{
string arr[] = {"geeksforgeeks", "geeks",
"geek", "geezer"};
int n = sizeof (arr) / sizeof (arr[0]);
string ans = commonPrefix(arr, 0, n-1);
if (ans.length())
cout << "The longest common prefix is "
<< ans;
else
cout << "There is no common prefix";
return (0);
}
Java
// Java Program to find the longest common prefix
class GFG {
// A Utility Function to find the common prefix between
// strings- str1 and str2
static String commonPrefixUtil(String str1, String str2) {
String result = "";
int n1 = str1.length(), n2 = str2.length();
for (int i = 0, j = 0; i <= n1 - 1 &&
j <= n2 - 1; i++, j++) {
if (str1.charAt(i) != str2.charAt(j)) {
break;
}
result += str1.charAt(i);
}
return (result);
}
// A Divide and Conquer based function to find the
// longest common prefix. This is similar to the
// merge sort technique
static String commonPrefix(String arr[], int low, int high) {
if (low == high) {
return (arr[low]);
}
if (high > low) {
// Same as (low + high)/2, but avoids overflow for
// large low and high
int mid = low + (high - low) / 2;
String str1 = commonPrefix(arr, low, mid);
String str2 = commonPrefix(arr, mid + 1, high);
return (commonPrefixUtil(str1, str2));
}
return null;
}
// Driver program to test above function
public static void main(String[] args) {
String arr[] = {"geeksforgeeks", "geeks",
"geek", "geezer"};
int n = arr.length;
String ans = commonPrefix(arr, 0, n - 1);
if (ans.length() != 0) {
System.out.println("The longest common prefix is "
+ ans);
} else {
System.out.println("There is no common prefix");
}
}
}
/* This JAVA code is contributed by 29AjayKumar*/
Python3
# A Python3 Program to find the longest common prefix
# A Utility Function to find the common
# prefix between strings- str1 and str2
def commonPrefixUtil(str1, str2):
result = ""
n1, n2 = len(str1), len(str2)
i, j = 0, 0
while i <= n1 - 1 and j <= n2 - 1:
if str1[i] != str2[j]:
break
result += str1[i]
i, j = i + 1, j + 1
return result
# A Divide and Conquer based function to
# find the longest common prefix. This is
# similar to the merge sort technique
def commonPrefix(arr, low, high):
if low == high:
return arr[low]
if high > low:
# Same as (low + high)/2, but avoids
# overflow for large low and high
mid = low + (high - low) // 2
str1 = commonPrefix(arr, low, mid)
str2 = commonPrefix(arr, mid + 1, high)
return commonPrefixUtil(str1, str2)
# Driver Code
if __name__ == "__main__":
arr = ["geeksforgeeks", "geeks",
"geek", "geezer"]
n = len(arr)
ans = commonPrefix(arr, 0, n - 1)
if len(ans):
print("The longest common prefix is", ans)
else:
print("There is no common prefix")
# This code is contributed by Rituraj Jain
C#
// C# Program to find the longest
// common prefix
using System;
class GFG
{
// A Utility Function to find
// the common prefix between
// strings- str1 and str2
static string commonPrefixUtil(string str1,
string str2)
{
string result = "";
int n1 = str1.Length,
n2 = str2.Length;
for (int i = 0, j = 0;
i <= n1 - 1 && j <= n2 - 1;
i++, j++)
{
if (str1[i] != str2[j])
break;
result += str1[i];
}
return (result);
}
// A Divide and Conquer based
// function to find the longest
// common prefix. This is similar
// to the merge sort technique
static string commonPrefix(string []arr,
int low, int high)
{
if (low == high)
return (arr[low]);
if (high > low)
{
// Same as (low + high)/2,
// but avoids overflow for
// large low and high
int mid = low + (high - low) / 2;
string str1 = commonPrefix(arr, low, mid);
string str2 = commonPrefix(arr, mid + 1, high);
return (commonPrefixUtil(str1, str2));
}
return null;
}
// Driver Code
public static void Main()
{
String []arr = {"geeksforgeeks", "geeks",
"geek", "geezer"};
int n = arr.Length;
String ans = commonPrefix(arr, 0, n - 1);
if (ans.Length!= 0)
{
Console.Write("The longest common " +
"prefix is " + ans);
}
else
{
Console.Write("There is no common prefix");
}
}
}
// This code is contributed by 29AjayKumar
输出 :
The longest common prefix is gee
时间复杂度:由于我们是通过所有的所有字符串中的字符进行迭代,所以我们可以说,时间复杂度为O(NM),其中,
N = Number of strings
M = Length of the largest string string
辅助空间:为了存储最长的前缀字符串,我们正在分配O(M Log N)。