Как найти максимальную длину строки

Sometimes, while working with Python Lists, we can have a problem in which we receive Strings as elements and wish to compute the String which has maximum length. This kind of problem can have applications in many domains. Let’s discuss certain ways in which this problem can be solved. 

Method #1 : Using loop This is the brute method in which we perform this task. In this, we run a loop to keep a memory of longest string length and return the string which has max length in list. 

Python3

test_list = ['gfg', 'is', 'best', 'for', 'geeks']

print("The original list : " + str(test_list))

max_len = -1

for ele in test_list:

    if len(ele) > max_len:

        max_len = len(ele)

        res = ele

print("Maximum length string is : " + res)

Output : 

The original list : ['gfg', 'is', 'best', 'for', 'geeks']
Maximum length string is : geeks

Time Complexity: O(n)
Auxiliary Space: O(1)

Method #2 : Using max() + key This method can also be used to solve this problem. In this, we use inbuilt max() with “len” as key argument to extract the string with the maximum length. 

Python3

test_list = ['gfg', 'is', 'best', 'for', 'geeks']

print("The original list : " + str(test_list))

res = max(test_list, key = len)

print("Maximum length string is : " + res)

Output : 

The original list : ['gfg', 'is', 'best', 'for', 'geeks']
Maximum length string is : geeks

Time Complexity: O(n) where n is the number of elements in the string list. The max() + key is used to perform the task and it takes O(n) time.
Auxiliary Space: O(1) constant additional space is created.

Method #3 : Using reduce() + lambda
In this method, we use the reduce() function from the functools module, and pass a lambda function as the first argument, which compares the length of the current and next elements and returns the element with the maximum length.

Python3

from functools import reduce

test_list = ['gfg', 'is', 'best', 'for', 'geeks']

print("The original list : " + str(test_list))

res = reduce(lambda x, y: x if len(x) > len(y) else y, test_list)

print("Maximum length string is : " + res)

Output

The original list : ['gfg', 'is', 'best', 'for', 'geeks']
Maximum length string is : geeks

Time Complexity: O(n) where n is the number of elements in the list
Auxiliary Space: O(1) as it uses only a single variable to store the result.

Method #4: Using recursive function. 

This method can also be used to solve this problem. In this, we use recursive function to extract the string with the maximum length. 

Python3

def find_maximum(lst,start=0,max_word=''):

  if start==len(lst): 

    return max_word

  if len(lst[start])>len(max_word): 

    max_word=lst[start]

  return find_maximum(lst,start+1,max_word) 

test_list = ['gfg', 'is', 'best', 'for', 'geeks']

print("The original list : " + str(test_list))

res = find_maximum(test_list)

print("Maximum length string is : " + res)

Output

The original list : ['gfg', 'is', 'best', 'for', 'geeks']
Maximum length string is : geeks

Time Complexity: O(n) 
Auxiliary Space: O(n) 

Method #4:Using a list comprehension

step-by-step algorithm for implementing the approach:

Initialize the list of strings.

Use a list comprehension to create a new list of string lengths. This iterates through each string in the original list and applies the len() function to get the length of each string.

Use the index() method on the lengths list to find the index of the longest string. The max() function returns the largest length, and the index() method returns the index of the first occurrence of that length.

Use the index of the longest string to retrieve the string from the original list.

Print the longest string.

Python3

test_list = ['gfg', 'is', 'best', 'for', 'geeks']

lengths = [len(s) for s in test_list]

longest_index = lengths.index(max(lengths))

longest_string = test_list[longest_index]

print("Longest string is : " + longest_string)

Output

Longest string is : geeks

time complexity: O(n), where n is the length of the test_list.

 auxiliary space complexity: O(n), because we create a new list to store the lengths of each string in the test_list. However, since the lengths list is only used to find the maximum length and then discarded, the space complexity is effectively O(1) in practice.

Method #4:Using the heapq module : 

Algorithm:

1.Initialize a list test_list with strings.
2.Use the heapq.nlargest() function to get the index of the largest element in the list based on the length of each string.
3.Use the index obtained in step 2 to get the corresponding string from the test_list.
4.Print the longest string.

Python3

import heapq

test_list = ['gfg', 'is', 'best', 'for', 'geeks']

index = heapq.nlargest(1, range(len(test_list)), key=lambda x: len(test_list[x]))[0]

longest_string = test_list[index]

print("Longest string is: " + longest_string)

Output

Longest string is: geeks

Time Complexity:

The time complexity of this algorithm is O(n log k), where n is the length of the list and k is the number of elements to be returned. In this case, we are only returning the single longest string, so k = 1, and the time complexity simplifies to O(n log 1) = O(n). This is because the heapq.nlargest() function has a time complexity of O(n log k) to find the k largest elements.
Space Complexity:

The space complexity of this algorithm is O(1), as we are only using a few variables to store the list of strings, the index of the largest string, and the longest string itself. We are not using any additional data structures that depend on the input size.

 Method #7: Using a sorted() function with a custom key

  • Initialize the list
  • Sort the list in descending order based on the length of each string
  • The first element in the sorted list will be the longest string
  • Print the result

Python3

test_list = ['gfg', 'is', 'best', 'for', 'geeks']

print("The original list: " + str(test_list))

res = sorted(test_list, key=len, reverse=True)[0]

print("Maximum length string is: " + res)

Output

The original list: ['gfg', 'is', 'best', 'for', 'geeks']
Maximum length string is: geeks

Time complexity: O(n log n) – sorting the list takes O(n log n) time in the worst case.
Auxiliary space: O(n) – we need to create a sorted copy of the list.

Last Updated :
04 May, 2023

Like Article

Save Article

Автор оригинала: Chris.

Используйте встроенный Python Макс () Функция с клавишным аргументом, чтобы найти самую длинную строку в списке. Позвоните Макс (lst,) Чтобы вернуть самую длинную строку в lst Использование встроенного Лен () Функция для ассоциирования веса каждой строки – самая длинная строка будет максимальной.

Постановка проблемы

Учитывая список строк Python. Найдите строку с максимальным количеством символов – самая длинная строка в списке.

Вот несколько примеров списка строк и желаемый выход:

# ['Alice', 'Bob', 'Pete']   ---->   'Alice'
# ['aaa', 'aaaa', 'aa']      ---->   'aaaa'
# ['']                       ---->   ''
# []                         ---->   ''

Решение: MAX () Функция с клавишным аргументом функции Len ()

Используйте встроенный Python Макс () Функция с клавишным аргументом, чтобы найти самую длинную строку в списке. Позвоните Макс (lst,) Чтобы вернуть самую длинную строку в lst используя Встроенный Лен () Функция для ассоциирования веса каждой строки – самая длинная строка будет максимальной.

Вот определение кода get_max_str () Функция, которая принимает список строк в качестве ввода и возвращает самую длинную строку в списке или ValueError. Если список пуст.

def get_max_str(lst):
    return max(lst, key=len)

Вот вывод на наших желаемых примерах:

print(get_max_str(['Alice', 'Bob', 'Pete']))
# 'Alice'

print(get_max_str(['aaa', 'aaaa', 'aa']))
# 'aaaa'

print(get_max_str(['']))
# ''

print(get_max_str([]))
# ValueError

Дело по границе: что, если список пуст?

Если вы хотите вернуть альтернативное значение в случае Список пуст Вы можете изменить get_max_str () Функция, чтобы включить второй дополнительный аргумент:

def get_max_str(lst, fallback=''):
    return max(lst, key=len) if lst else fallback


print(get_max_str([]))
# ''

print(get_max_str([], fallback='NOOOOOOOOO!!!!!!'))
# NOOOOOOOOO!!!!!!

Решение с циркой

Меньше Pythonic, но для начинающих кодеров, более читаемая версия – это следующий цикл, –

def get_max_str(lst, fallback=''):
    if not lst:
        return fallback

    max_str = lst[0]   # list is not empty

    for x in lst:
        if len(x) > len(max_str):
            max_str = x

    return max_str


print(get_max_str(['Alice', 'Bob', 'Pete']))
# 'Alice'

print(get_max_str(['aaa', 'aaaa', 'aa']))
# 'aaaa'

print(get_max_str(['']))
# ''

print(get_max_str([], fallback='NOOOOOOOOO!!!!!!'))
# NOOOOOOOOO!!!!!!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.

Оригинал: “https://blog.finxter.com/how-to-find-the-longest-string-in-a-python-list/”

Разбейте задачу на подзадачи.

  1. Как читать и писать файл со строками? – std::fstream и производные классы
  2. Как работать со строками? Как узнать длину строки? – std::string
  3. Как работать с набором строк? – std::list / std::vector
  4. Как отсортировать набор? – std::list::sort() + шаблоны + компаратор

После 1-2 часов внимательной работы с поисковиком по этим пунктам у вас будет хорошая база знаний для решения этой задачи. Обязательно пишите небольшие кусочки кода самостоятельно, не берите готовые примеры – это убивает творчество.

UPD. Вопрос был изменен автором, поэтому обновляю и ответ

Чтобы узнать самые длинные строки в файле, придется прочитать весь файл. Если вы не прочитаете хотя бы одну строку – возможно она и была самой длинной. Проще всего использовать std::fstream + std::list + std::getline

std::list<std::string> list; // Хранилище строк
std::ifstream file("тут ваш путь"); // Файл для чтения
std::string line; // Одна строка для обработки
while (std::getline(file, line))
{
    // обработайте строку
    // например, добавьте её в список строк
    list.push_back(line);
}

Теперь у нас есть список из строк. Нам нужно взять оттуда N самых длинных строк. Сортируем по длине строки! Нам поможет std::list::sort()

Необходимо определить функцию для сравнения двух элементов списка

bool compare_by_length (const std::string& first, const std::string& second)
{
    return ( first.length() < second.length() );
}

Теперь мы можем использовать эту функцию для сортировки

// Сортируем список
list.sort(compare_by_length);

// Нам нужно взять первые N элементов
std::list<std::string>::const_iterator i;
int index = 0;
int N = 5;
// Выводим строки из списка до тех пор, пока есть строки в списке
// и выведено менее N строк
for (i = list.begin(); (i != list.end()) && (count < N;) ++i) {
    ++count; // Увеличиваем количество взятых строк
    std::cout << index << ": " << (*i) << std::endl;
}

В итоге мы получим первые N самых длинных строк из файла

Продолжаем разбирать задачи с сайта LeetCode. На этот раз — посложнее:

Есть строка s — нужно найти длину самой длинной подстроки, в которой каждый символ используется только один раз.

Например:

если s = “abcabcbb”, то ответ будет 3, потому что строка без повторений — это “abc”;

если s = “bbbbb”, то ответ будет 1, потому что самая длинная подстрока тут будет из одного символа;

если s = “pwwkew”, то ответ будет 3, потому что тут две самые одинаково длинные подстроки — “wke” и “kew”, в которых по 3 символа.

Такие алгоритмы иногда используются для выявления закономерностей и поиска общих элементов, поэтому их тоже могут спросить на собеседованиях.

Решение: использовать встроенные функции для работы со строками

Самое простое решение — собирать отдельную подстроку из символов и смотреть каждый раз, есть очередной символ в этой подстроке или нет. Если нет — добавляем его в конец и смотрим дальше. А если очередной символ там уже есть, то в подстроке оставляем только то, что идёт после этого символа, и добавляем туда текущий. 

Например, если у нас в подстроке хранится “abcdf” и мы снова встречаем b, то делаем так:

  1. Получаем номер символа b в подстроке → он равен 1 (если интересно, почему не 2, — почитайте, почему счёт в программировании начинается с нуля, а не с единицы).
  2. Формируем новую строку, начиная с 1 символа и до конца → “cdf”.
  3. Добавляем к ней в конец наш текущий символ b → “cdfb”.

Так шаг за шагом мы проверим все вложенные строки и найдём самую длинную без повторов. Звучит сложно, но в коде всё выглядит гораздо проще. Почитайте комментарии, чтобы разобраться в каждом шаге:

# исходная строка
s = 'abcabcdcc'

# здесь будет наш ответ
res = 0
# на старте у нас пустая подстрока
sub = ''
# перебираем все символы в исходной строке
for char in s:
	# если символа нет в подстроке
	if char not in sub:
		# добавляем его туда
		sub += char
		# смотрим, максимальный ли это результат, и если да — запоминаем его
		res = max(res, len(sub))
	# если символ в подстроке есть
	else:
		# получаем индекс текущего символа в подстроке
		cut = sub.index(char)
		# сокращаем нашу подстроку: оставляем только то, что идёт после символа-дубликата, и добавляем к строке текущий символ
		sub = sub[cut+1:] + char
		
# выводим результат на экран
print(res)

Решение: проверить всю вложенную строку

Зайдём с другой стороны — напишем функцию, которая будет проверять, есть в указанной подстроке повторяющиеся символы или нет. Логика будет такая:

  1. Передаём в функцию начальный и конечный индекс, который определяет границы подстроки.
  2. Заводим массив, в который будем складывать проверенные символы и проверять на дубли.
  3. По очереди проверяем все символы в указанном диапазоне и смотрим, есть ли очередной символ в нашем массиве.
  4. Если есть — выводим False, что означает, что в подстроке есть повторяющиеся символы.
  5. Если символа нет — добавляем его в наш массив.
  6. Если мы проверили все символы и ни одного не было в том массиве — возвращаем True, то есть повторов нет.

Теперь запишем это на Python:

# исходная строка
s = 'abcabcdcc'

# функция, которая проверит, есть ли в подстроке повторяющиеся символы
# на вход отправляем начальную и конечную позицию в строке для проверки
def check(start, end):
    # создаём пустое множество
    chars = set()
    # делаем цикл от начального до конечного символа
    for i in range(start, end + 1):
        # получаем очередной символ из строки
        c = s[i]
        # если символа уже есть в множестве
        if c in chars:
			# возвращаем False — в строке есть повторяющиеся символы
            return False
		# добавляем символ в множество
        chars.add(c)
	# если дошли досюда — возвращаем True
    return True

Теперь перейдём к основной части. Раз мы научились проверять, есть повторы в подстроке или нет, то нам остаётся только найти и проверить все вложенные строки. Сделаем это обычным перебором с вложенным циклом: будем проверять все подстроки, сначала начиная с первого символа, потом со второго и так далее. При этом мы будем каждый раз считать и запоминать максимальную длину подстроки без повторов, которая у нас получилась:

# --- основной алгоритм ---
# получаем длину строки
n = len(s)
# здесь будет наш ответ
res = 0
# перебираем символы от первого до последнего
for i in range(n):
	# перебираем символы от текущего до последнего
    for j in range(i, n):
		# если в получившейся подстроке нет повторяющихся символов
        if check(i, j):
			# смотрим, максимальный ли это результат, и если да — запоминаем его
            res = max(res, j - i + 1)
# выводим результат на экран
print(res)

Объединим обе части и получим готовый код:

# исходная строка
s = 'abcabcdcc'

# функция, которая проверит, есть ли в подстроке повторяющиеся символы
# на вход отправляем начальную и конечную позицию в строке для проверки
def check(start, end):
    # создаём пустое множество
    chars = set()
    # делаем цикл от начального до конечного символа
    for i in range(start, end + 1):
        # получаем очередной символ из строки
        c = s[i]
        # если символа уже есть в множестве
        if c in chars:
			# возвращаем False — в строке есть повторяющиеся символы
            return False
		# добавляем символ в множество
        chars.add(c)
	# если дошли досюда — возвращаем True
    return True

# --- основной алгоритм ---
# получаем длину строки
n = len(s)
# здесь будет наш ответ
res = 0
# перебираем символы от первого до последнего
for i in range(n):
	# перебираем символы от текущего до последнего
    for j in range(i, n):
		# если в получившейся подстроке нет повторяющихся символов
        if check(i, j):
			# смотрим, максимальный ли это результат, и если да — запоминаем его
            res = max(res, j - i + 1)
# выводим результат на экран
print(res)

Вёрстка:

Кирилл Климентьев

Добавить комментарий