Рубрики

Самый длинный общий префикс, использующий символ за соответствием

Учитывая набор строк, найдите самый длинный общий префикс.

Input  : {“geeksforgeeks”, “geeks”, “geek”, “geezer”}
Output : "gee"

Input  : {"apple", "ape", "april"}
Output : "ap"

Мы обсудили алгоритм поиска по словам в предыдущем посте .

В этом алгоритме, вместо того, чтобы проходить строки по одной, мы будем просматривать символы по одному.

Мы рассматриваем наши строки как «geeksforgeeks», «geeks», «geek», «geezer».

Ниже приведена реализация этого подхода.

C ++

// Программа на C ++, чтобы найти самый длинный общий префикс
#include<bits/stdc++.h>

using namespace std;

  
// Функция для поиска строки, имеющей минимум
// длина и возвращает эту длину

int findMinLength(string arr[], int n)

{

    int min = arr[0].length();

  

    for (int i=1; i<n; i++)

        if (arr[i].length() < min)

            min = arr[i].length();

  

    return(min);

}

  
// Функция, которая возвращает самый длинный общий префикс
// из массива строк

string commonPrefix(string arr[], int n)

{

    int minlen = findMinLength(arr, n);

  

    string result; // Наша результирующая строка

    char current;  // текущий персонаж

  

    for (int i=0; i<minlen; i++)

    {

        // Текущий символ (должен быть таким же

        // во всех строках быть частью

        // результат)

        current = arr[0][i];

  

        for (int j=1 ; j<n; j++)

            if (arr[j][i] != current)

                return result;

  

        // Добавить к результату

        result.push_back(current);

    }

  

    return (result);

}

  
// Программа драйвера для проверки вышеуказанной функции

int main()

{

    string arr[] = {"geeksforgeeks", "geeks",

                    "geek", "geezer"};

    int n = sizeof (arr) / sizeof (arr[0]);

  

    string ans = commonPrefix (arr, n);

  

    if (ans.length())

        cout << "The longest common prefix is "

             << ans;

    else

        cout << "There is no common prefix";

    return (0);

}

Джава

// Программа на Java, чтобы найти самый длинный общий префикс

class GFG 

{

  

    // Функция для поиска строки, имеющей минимум

    // длина и возвращает эту длину

    static int findMinLength(String arr[], int n) 

    {

        int min = arr[0].length();

  

        for (int i = 1; i < n; i++) 

        {

            if (arr[i].length() < min)

            {

                min = arr[i].length();

            }

        }

  

        return (min);

    }

  

    // Функция, которая возвращает самый длинный общий префикс

    // из массива строк

    static String commonPrefix(String arr[], int n)

    {

        int minlen = findMinLength(arr, n);

  

        String result = ""; // Наша результирующая строка

        char current; // текущий персонаж

  

        for (int i = 0; i < minlen; i++)

        {

            // Текущий символ (должен быть таким же

            // во всех строках быть частью

            // результат)

            current = arr[0].charAt(i);

  

            for (int j = 1; j < n; j++) 

            {

                if (arr[j].charAt(i) != current) 

                {

                    return result;

                }

            }

  

            // Добавить к результату

            result += (current);

        }

  

        return (result);

    }

  

    // Программа драйвера для проверки вышеуказанной функции

    public static void main(String[] args) 

    {

        String arr[] = {"geeksforgeeks", "geeks",

            "geek", "geezer"};

        int n = arr.length;

  

        String ans = commonPrefix(arr, n);

  

        if (ans.length() > 0) {

            System.out.println("The longest common prefix is "

                    + ans);

        } else {

            System.out.println("There is no common prefix");

        }

    }

}

  
// Этот код предоставлен Rajput-Ji

Python 3

# Python 3 Программа для поиска самого длинного общего префикса

   
# Функция для поиска строки, имеющей минимум
# длина и возвращает эту длину

def findMinLength(arr, n):

  

    min = len(arr[0])

   

    for i in range(1,n):

        if (len(arr[i])< min):

            min = len(arr[i])

   

    return(min)

   
# Функция, которая возвращает самый длинный общий префикс
# из массива строк

def commonPrefix(arr, n):

  

    minlen = findMinLength(arr, n)

    result =""

    for i in range(minlen):

      

        # Текущий символ (должен быть таким же

        # во всех строках быть частью

        # результат)

        current = arr[0][i]

   

        for j in range(1,n):

            if (arr[j][i] != current):

                return result

   

        # Добавить к результату

        result = result+current

   

    return (result)

   
# Программа драйвера для проверки вышеуказанной функции

if __name__ == "__main__":

      

    arr = ["geeksforgeeks", "geeks",

                    "geek", "geezer"]

    n = len(arr)

   

    ans = commonPrefix (arr, n)

   

    if (len(ans)):

        print("The longest common prefix is ",ans)

    else:

        print("There is no common prefix")

C #

// AC # Программа для поиска самого длинного общего префикса

using System;

      

class GFG 

{

  

    // Функция для поиска строки, имеющей минимум

    // длина и возвращает эту длину

    static int findMinLength(String []arr, int n) 

    {

        int min = arr[0].Length;

  

        for (int i = 1; i < n; i++) 

        {

            if (arr[i].Length < min)

            {

                min = arr[i].Length;

            }

        }

  

        return (min);

    }

  

    // Функция, которая возвращает самый длинный общий префикс

    // из массива строк

    static String commonPrefix(String []arr, int n)

    {

        int minlen = findMinLength(arr, n);

  

        String result = ""; // Наша результирующая строка

        char current; // текущий персонаж

  

        for (int i = 0; i < minlen; i++)

        {

            // Текущий символ (должен быть таким же

            // во всех строках быть частью

            // результат)

            current = arr[0][i];

  

            for (int j = 1; j < n; j++) 

            {

                if (arr[j][i] != current) 

                {

                    return result;

                }

            }

  

            // Добавить к результату

            result += (current);

        }

  

        return (result);

    }

  

    // Код драйвера

    public static void Main(String[] args) 

    {

        String []arr = {"geeksforgeeks", "geeks",

            "geek", "geezer"};

        int n = arr.Length;

  

        String ans = commonPrefix(arr, n);

  

        if (ans.Length > 0) 

        {

            Console.WriteLine("The longest common prefix is "

                    + ans);

        

        else

        {

            Console.WriteLine("There is no common prefix");

        }

    }

}

  
/ * Этот код предоставлен PrinciRaj1992 * /


Выход :

The longest common prefix is  gee


Чем этот алгоритм лучше, чем алгоритм « Word by Word Matching »?

В наборе 1 мы обсуждали алгоритм «совпадение слов».

Предположим, у вас есть входные строки as- «geeksforgeeks», «geeks», «geek», «geezer», «x».

Теперь нет общего префикса строки из вышеуказанных строк. С помощью алгоритма «Word by Word Matching», обсуждавшегося в наборе 1, мы приходим к выводу, что нет общей строки префикса путем обхода всех строк. Но если мы используем этот алгоритм, то в самой первой итерации мы узнаем, что нет общей строки префикса, так как мы не будем дальше искать второй символ каждой строки.

Этот алгоритм имеет огромное преимущество, когда слишком много строк.

Сложность времени: поскольку мы перебираем все символы всех строк, мы можем сказать, что сложность времени равна O (NM), где,

N = Number of strings
M = Length of the largest string string 

Вспомогательное пространство: для хранения самой длинной строки префикса мы выделяем пространство, которое равно O (M).

Эта статья предоставлена Rachit Belwariar . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Самый длинный общий префикс, использующий символ за соответствием

0.00 (0%) 0 votes