Печать самой длинной последовательности букв с использованием Python - PullRequest
0 голосов
/ 02 октября 2019

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

Если несколько подпоследовательностей имеют одинаковую длину, код возвращает первую.
Если input_str не содержит букв, функция возвращает пустуюстрока.

Например,

  • для входной строки 'ab24 [AaBbCDExy0longest]', должно быть напечатано 'AaBbCDExy'.

  • для входной строки 'aa a1234b | c | d' должно быть напечатано 'a'.

  • для входной строки '12345', должно быть напечатано "" (пустая строка).

Пробовал следующий код, но напрасно:

# Your code here

#longest_letterSeq = '' 
def longestSubstring(s): 
    longest_letterSeq = '' 
    i = 0
    while(i<len(s)): 

        curr_letterSeq = '' 

        # For letter substring  
        while(i<len(s) and s[i].isalpha()): 
            curr_letterSeq += s[i] 
            i+= 1

        # Case handling if the character is not letter     
            if(i< len(s) and not(s[i].isalpha())) : 
                i+= 1

            if(len(curr_letterSeq) > len(longest_letterSeq) ): 
                longest_letterSeq = curr_letterSeq 

    return longest_letterSeq

str = input("Please input your string here: ")

print(longestSubstring(str))

Может ли кто-нибудь помочь с отредактированным или правильным кодом?

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

Один из вариантов использования re.findall с max:

import re
max(re.findall('[a-zA-Z]+',  'ab24[AaBbCDExy0longest]'), key=len)
# 'AaBbCDExy'

max(re.findall('[a-zA-Z]+', 'a a a1234b|c|d '), key=len)
# 'a'

Небольшой взлом для рассмотрения случаев, когда нет совпадений:

max(re.findall('[a-zA-Z]+', '12345 ') or [''], key=len)
# ''

Хотя я 'Я бы предложил вам воспользоваться более читабельным подходом:

r = re.findall('[a-zA-Z]+', '12345 ') 
if r:
    out = max(r, key=len)
else:
    out = ''

Или, как подсказывает @deepstop, с условным выражением:

out = max(r, key=len) if r else ''
0 голосов
/ 02 октября 2019

Альтернативный подход состоит в том, чтобы заменить все не-буквы пробелом, разделить и затем выбрать самую длинную строку.

import re

def func(s) :
    l = re.sub('[^a-zA-Z]+', ' ', s).split()
    l.append('')  # Append an empty string so the list is bound not to be empty.
    return max(l, key=len)

func('ab24[AaBbCDExy0longest]')
func('foo2bar')
func('')
0 голосов
/ 02 октября 2019

как yatu, моим первым решением такой проблемы было бы регулярное выражение. Однако я предложил решение, основанное на вашем подходе. проблема в вашем коде в том, что вы увеличиваете i только тогда, когда символ является альфа. Таким образом, для строки abc123 вы увеличите i в 3 раза. но так как следующий символ не является альфа, вы не incerase я. это означает, что теперь я застрял со значением 3, а это меньше, чем длина строки 6. Таким образом, ваша функция застряла в бесконечном цикле, так как вы перестаете увеличивать i.

Упрощенная версия вашего кода можетбыть написано как ниже. по существу, нет необходимости во втором цикле while. В действительности, цикл while вообще не нужен, вы можете просто использовать цикл for для перебора каждого символа в строке

def longestSubstring(string):
    longest_letterSeq = ''
    curr_letterSeq = ''
    for char in string:
        if char.isalpha():
            curr_letterSeq += char
        else:
            if len(curr_letterSeq) > len(longest_letterSeq):
                longest_letterSeq = curr_letterSeq
            curr_letterSeq = ''
    return longest_letterSeq

my_strings = ['ab24[AaBbCDExy0longest]', 'a a a1234b|c|d ', '12345']
for string in my_strings:
    longest = longestSubstring(string)
    print(f'the longest string in "{string}" is "{longest}"')

OUTPUT

the longest string in "ab24[AaBbCDExy0longest]" is "AaBbCDExy"
the longest string in "a a a1234b|c|d " is "a"
the longest string in "12345" is ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...