Skip to content

Commit

Permalink
Merge pull request #1847 from rajdeepchakraborty-rc/prefix
Browse files Browse the repository at this point in the history
Added: Longest Common Prefix Program
  • Loading branch information
pankaj-bind authored Nov 10, 2024
2 parents a9b0c8b + 4bb5107 commit 3030061
Show file tree
Hide file tree
Showing 2 changed files with 153 additions and 0 deletions.
91 changes: 91 additions & 0 deletions String Algorithms/Longest_Common_Prefix/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# Longest Common Prefix

## Description

This program finds the Longest Common Prefix (LCP) among an array of strings. The LCP is the longest sequence of characters shared at the beginning of all strings in the array. The program employs an efficient algorithm to identify the common prefix by comparing the strings character by character.

```
Example:
Enter the number of strings: 5
Enter the strings:
String 1: prawn
String 2: prajakta
String 3: prince
String 4: probably
String 5: project
Output:
The longest common prefix is: pr
```

### Problem Definition

1. **Given**:
- An array of strings and the number of strings, `n`.

2. **Objective**:
- Find the longest sequence of characters common to the beginning of all strings in the array.

### Algorithm Overview

1. **Input Validation**:
- Ensure the array contains at least one string.

2. **Prefix Comparison**:
- Start with the first string as the initial prefix.
- Compare the prefix with each subsequent string character by character.
- Update the prefix to the common portion after each comparison.

3. **Early Termination**:
- If the prefix becomes empty at any point, terminate early as there is no common prefix.

5. **Output Result**:
- Display the longest common prefix if found; otherwise, indicate no common prefix.

### Key Features

- Efficiently determines the common prefix without unnecessary comparisons.
- Handles edge cases such as identical strings, empty strings, and no common prefix.
- User-friendly input and output.

### Time Complexity

- **Best case**: `O(n * m)`, where `n` is the number of strings and `m` is the length of the shortest string.
- **Worst case**: Same as the best case since each character is processed at most once.

### Space Complexity

- `O(m)` for storing the prefix, where `m` is the length of the shortest string

## Implementation

The implementation in C includes:

1. **Input Handling**:
- Accepts the number of strings and their contents.

2. **Logic**:
- A function to iteratively compute the longest common prefix.
- Compares the prefix with each string and updates it to the common characters.

## Edge Cases for Testing

1. **No Common Prefix**:
- Input: `["dog", "racecar", "car"]`
- Output: `There is no common prefix among the strings.`
2. **All Strings Identical**:
- Input: `["apple", "apple", "apple"]`
- Output: `The longest common prefix is: apple`
3. **Single String**:
- Input: `["alone"]`
- Output: `The longest common prefix is: alone`
4. **Empty Strings**:
- Input: `["", "abc", "abcd"]`
- Output: `There is no common prefix among the strings.`

## Usage

- Compile the program using a C compiler (e.g., `gcc longest_common_prefix.c -o lcp`).
- Run the program (`./lcp`).
- Input the number of strings and their values as prompted.
- Observe the output indicating the longest common prefix or a message stating there is no common prefix.
62 changes: 62 additions & 0 deletions String Algorithms/Longest_Common_Prefix/longest_common_prefix.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include <stdio.h>
#include <string.h>

// Defined max value for number of strings and their length
#define MAX_STRINGS 100
#define MAX_LENGTH 100

// Function to find the longest common prefix among an array of strings
char* longestCommonPrefix(char arr[][MAX_LENGTH], int n) {
static char prefix[MAX_LENGTH];
strcpy(prefix, arr[0]); // Assume the first string as the prefix

for (int i = 1; i < n; i++) {
int j = 0;

// Compare the current prefix with the next string character by character
while (j < strlen(prefix) && j < strlen(arr[i]) && prefix[j] == arr[i][j]) {
j++;
}

// Update the prefix to the common portion
prefix[j] = '\0';

// If the prefix becomes empty, return immediately
if (prefix[0] == '\0') {
return prefix;
}
}

return prefix;
}

int main() {
int n;

printf("Enter the number of strings: ");
scanf("%d", &n);

if (n <= 0 || n > MAX_STRINGS) {
printf("Invalid number of strings! Please enter a value between 1 and %d.\n", MAX_STRINGS);
return 1;
}

// 2D array with rows as strings and columns for string lenth for easy comparison
char arr[MAX_STRINGS][MAX_LENGTH];

printf("Enter the strings:\n");
for (int i = 0; i < n; i++) {
printf("String %d: ", i + 1);
scanf("%s", arr[i]);
}

char* prefix = longestCommonPrefix(arr, n);

if (strlen(prefix) > 0) {
printf("The longest common prefix is: %s\n", prefix);
} else {
printf("There is no common prefix among the strings.\n");
}

return 0;
}

0 comments on commit 3030061

Please sign in to comment.