План курса / Все задачи / Алгоритмы и структуры данных
Общий префикс
легко
# решено
Дан массив строк strs. Нужно вернуть самую длинную строку, которая является префиксом всех строк из strs. Если общего префикса нет, верни пустую строку "".
Ввод: strs = ["dog","cat","bike"]
Вывод: ""
Объяснение: нет общего префикса.
Ограничения:
len(strs) >= 1
len(strs[i]) >= 1
public class Solution {
public static string LongestCommonPrefix(List<string> strs) {
// Определяем минимальную длину строки среди всех
int minLen = strs[0].Length;
foreach (string el in strs) {
minLen = Math.Min(minLen, el.Length);
}
// Проверяем совпадение символов на каждой позиции до minLen
for (int i = 0; i < minLen; i++) {
char ch = strs[0][i];
foreach (string el in strs) {
if (el[i] != ch) {
return el.Substring(0, i);
}
}
}
// Все символы совпадают на отрезке длины minLen
return strs[0].Substring(0, minLen);
}
}
#include <vector>
#include <string>
using namespace std;
string longestCommonPrefix(vector<string>& strs) {
// Определяем минимальную длину строки среди всех
int minLen = strs[0].size();
for (string& el : strs) {
minLen = min(minLen, (int)el.size());
}
// Проверяем совпадение символов на каждой позиции до minLen
for (int i = 0; i < minLen; i++) {
char ch = strs[0][i];
for (string& el : strs) {
if (el[i] != ch) {
return el.substr(0, i);
}
}
}
// Все символы совпадают на отрезке длины minLen
return strs[0].substr(0, minLen);
}
package main
func longestCommonPrefix(strs []string) string {
// Определяем минимальную длину строки среди всех
minLen := len(strs[0])
for _, el := range strs {
if len(el) < minLen {
minLen = len(el)
}
}
// Проверяем совпадение символов на каждой позиции до minLen
for i := 0; i < minLen; i++ {
ch := strs[0][i]
for _, el := range strs {
if el[i] != ch {
return el[:i]
}
}
}
// Все символы совпадают на отрезке длины minLen
return strs[0][:minLen]
}
import java.util.*;
public class Solution {
public static String longestCommonPrefix(List<String> strs) {
// Определяем минимальную длину строки среди всех
int minLen = strs.get(0).length();
for (String el : strs) {
minLen = Math.min(minLen, el.length());
}
// Проверяем совпадение символов на каждой позиции до minLen
for (int i = 0; i < minLen; i++) {
char ch = strs.get(0).charAt(i);
for (String el : strs) {
if (el.charAt(i) != ch) {
return el.substring(0, i);
}
}
}
// Все символы совпадают на отрезке длины minLen
return strs.get(0).substring(0, minLen);
}
}
from typing import *
def longest_common_prefix(strs: List[str]) -> str:
# Определяем минимальную длину строки среди всех
min_len = len(strs[0])
for el in strs:
min_len = min(min_len, len(el))
# Проверяем совпадение символов на каждой позиции до min_len
for i in range(min_len):
ch = strs[0][i]
for el in strs:
if ch != el[i]:
return el[:i]
# Все символы совпадают на отрезке длины min_len
return strs[0][:min_len]
/**
* @param {string[]} strs
* @returns {string}
*/
export function longestCommonPrefix(strs) {
// Определяем минимальную длину строки среди всех
let minLen = strs[0].length;
for (const el of strs) {
minLen = Math.min(minLen, el.length);
}
// Проверяем совпадение символов на каждой позиции до minLen
for (let i = 0; i < minLen; i++) {
const ch = strs[0][i];
for (const el of strs) {
if (el[i] !== ch) {
return el.slice(0, i);
}
}
}
// Все символы совпадают на отрезке длины minLen
return strs[0].slice(0, minLen);
}
Оценка сложности
Время: O(n), где n - число символов во всех строках
Память: O(n)
Время так же можно оценить как O(n*m), где n - число строк, а m - размер минимальной строки. Обе оценки верные.