Как найти одинаковые буквы в слове python

Пользователь вводит слово. Программа должна проверить, есть ли в строке одинаковые буквы и посчитать сколько раз они встречаются.

Использовать массивы, модули, листы и словари нельзя. Только цикл, только строки.

word = str(input('Введіть слово: '))
count = 0

while count <= len(word):
   for i in word:
       if i == word.[count]
print(count)

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

0xdb's user avatar

0xdb

51.4k194 золотых знака56 серебряных знаков232 бронзовых знака

задан 8 окт 2020 в 19:02

anastasia's user avatar

5

Только цикл, только строки:

word = "гиппопотам"
seen = ""

for c in word:
    if c not in seen:
        print(f"{c}: {word.count(c)}")
        seen += c

вывод:

г: 1
и: 1
п: 3
о: 2
т: 1
а: 1
м: 1

ответ дан 8 окт 2020 в 19:18

MaxU - stand with Ukraine's user avatar

2

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

word = "гиппопотам"

while word:
    if word.count(word[0])>1: # если вывод количества нужен для всех, а не только для повторяющихся, то этот if можно убрать
        print(word[0], ':', word.count(word[0]))
    word = word.replace(word[0], '')

ответ дан 8 окт 2020 в 19:22

Andrey Maslov's user avatar

Andrey MaslovAndrey Maslov

2,9601 золотой знак5 серебряных знаков11 бронзовых знаков

4

word = input('Введіть слово: ')

for i in range(len(word)):
    if word[i] not in word[:i]:
        print(word[i], word.count(word[i])) 

Вот второй вариант:

word = input('Введіть слово: ')
 
for i in range(len(word)):
    if i == word.find(word[i]):
        print(word[i], word.count(word[i])) 

ответ дан 8 окт 2020 в 19:27

Danis's user avatar

DanisDanis

19.1k5 золотых знаков20 серебряных знаков55 бронзовых знаков

1

Given a list of strings, write a Python program to check whether each string has all the characters same or not. Given below are a few methods to check the same. 

Method #1: Using Naive Method [Inefficient] 

Python3

ini_list = ["aaaaaaaaaaa", "aaaaaaabaa"]

print("Initial Strings list", ini_list)

flag = True

for i in ini_list:

    for j in range(0, len(i)-1):

        if i[j] != i[j + 1]:

            print("String {} don't have all characters same".format(i))

            flag = False

            break

    if flag == True:

        print("String {} have all characters same".format(i))

Output

Initial Strings list ['aaaaaaaaaaa', 'aaaaaaabaa']
String aaaaaaaaaaa have all characters same
String aaaaaaabaa don't have all characters same

Time Complexity: O(n^2), where n is the length of the longest string in the list.
Auxiliary Space: O(1), as the code only uses a few variables and does not store any additional data.

Method #2: Using String Comparisons 

Python3

ini_list = ["aaaaaaaaaaa", "aaaaaaabaa"]

print("Initial Strings list", ini_list)

for i in ini_list:

    if i == len(i)*i[0]:

        print("String {} have all characters same".format(i))

    else:

        print("String {} don't have all characters same".format(i))

Output

Initial Strings list ['aaaaaaaaaaa', 'aaaaaaabaa']
String aaaaaaaaaaa have all characters same
String aaaaaaabaa don't have all characters same

Time Complexity: O(n) where n is the length of the string.
Auxiliary Space: O(1) as we are using only a variable to store the first character of the string and compare it with other characters.

Method #3: Using count comparison 

Python3

ini_list = ["aaaaaaaaaaa", "aaaaaaabaa"]

print("Initial Strings list", ini_list)

for i in ini_list:

    if i.count(i[0]) == len(i):

        print("String {} have all characters same".format(i))

    else:

        print("String {} don't have all characters same".format(i))

Output

Initial Strings list ['aaaaaaaaaaa', 'aaaaaaabaa']
String aaaaaaaaaaa have all characters same
String aaaaaaabaa don't have all characters same

Time complexity: O(n), where n is the number of strings in the list ini_list.
Auxiliary space: O(1), as the space used is constant regardless of the size of the input.

Method #4 : Using len() and set() methods

Python3

ini_list = ["aaaaaaaaaaa", "aaaaaaabaa"]

print("Initial Strings list", ini_list)

flag = True

for i in ini_list:

    a = len(set(i))

    if(a == 1):

        print("String {} have all characters same".format(i))

    else:

        print("String {} don't have all characters same".format(i))

Output

Initial Strings list ['aaaaaaaaaaa', 'aaaaaaabaa']
String aaaaaaaaaaa have all characters same
String aaaaaaabaa don't have all characters same

The time complexity of this code is O(n*m) where n is the length of the list ini_list and m is the length of the longest string in the list. 

The auxiliary space complexity of this code is O(1), as we are not using any extra space to store intermediate results. 

Method #5 : Using all()

Here’s an example of using the built-in all() function to check if a given string contains all the same characters in Python:

In this example, we first initialize a list of strings called ini_list and print it to show the original list of strings. We then use the all() function along with a generator expression to check if all characters in the input string are the same. The generator expression iterates through each character in the input string, comparing it to the first character of the input string.

The all() function returns True if all elements in the input iterable are True, and False otherwise. If the result of the all() function is True, it means that the input string contains all the same characters, and if the result is False, it means that the input string does not contain all the same characters.

Python3

ini_list = ["aaaaaaaaaaa", "aaaaaaabaa"]

print("Initial Strings list", ini_list)

for i in ini_list:

    result = all(c == i[0] for c in i)

    if result:

        print("String {} have all characters same".format(i))

    else:

        print("String {} don't have all characters same".format(i))

Output

Initial Strings list ['aaaaaaaaaaa', 'aaaaaaabaa']
String aaaaaaaaaaa have all characters same
String aaaaaaabaa don't have all characters same

Time Complexity: O(n) where n is the length of the input string. This is because the method iterates through the input string once to compare each character with the first character of the input string.
Auxiliary Space: O(1) as it doesn’t consume any extra space.

Last Updated :
14 Mar, 2023

Like Article

Save Article

  • python строки

Ответы

Аватар пользователя Ivan Mamtsev

Чтобы проверить есть ли в строке повторяющиесся символы можно, например, обойти строку, складывая встречающиеся символы в множество (set) и проверять, положили ли мы его раньше

text = 'Foobaar'
seen = set()
for ch in text:
    if ch in seen:
        print('Was seen before!')
        break
    else:
        seen.add(ch)
# Was seen before!



0



0

Добавьте ваш ответ

Рекомендуемые курсы

13 часов

Старт в любое время

12 часов

Старт в любое время

21 час

Старт в любое время

Похожие вопросы

Голосование за лучший ответ

Молот Шотландцев

Высший разум

(300672)


1 год назад

def f(a,b): return ‘есть одинаковые буквы’ if len(a + b) != len(set(a + b)) else ‘буквы разные’

print(f(‘abc’,’defh’))
print(f(‘abc’,’daefh’))
print(f(‘atbc’,’daefh’))
print(f(‘xyz’,’daefh’))

КавабангаПрофи (880)

1 год назад

Не совсем корректно работает. Если в каком-то слове есть повторяющиеся буквы, то выдаст “есть одинаковые буквы”.

КавабангаПрофи (880)

1 год назад

Вот так скорее всего правильней
if len(set(a)) + len(set(b)) != len(set(a + b))

Vitness

Просветленный

(32688)


1 год назад

Из этого потока мыслей ничего не смог понять, но проверка на то, есть ли одинаковые буквы в словах делается так:
if set(word1) & set(word2): …

Кирилл ТарасевичУченик (174)

1 год назад

У меня в программе есть список, в него записываются данные через цикл for (спрашиваются слова у пользователя). Количество элементов этого списка зависит от того, сколько было введено количество в начале программы (тобиж пользователь в начале программы ввел под количеством слов 5 (это в моей программе переменная n), то список будет состоять из 5 слов). Вот как мне вывести из списка слова так, чтобы можно было у всех слов из этого списка проверить похожие буквы? (Если не понятен ход моих мыслей – говори, постараюсь изложить еще понятнее).

Кавабанга

Профи

(880)


1 год назад

А почему у тебя, если l < len(n1), печатается ‘У слова меньшее кол-во символов чем было задано’. Наоборот же, у слова большее кол-во символов.

Давайте решим простую задачку, связанную с обработкой строк в Python.

# Определите, все ли символы в строке уникальны. 
# Использовать дополнительные структуры данных нельзя.

Довольно просто, верно? Это, собственно,
первое задание из раздела «Массивы и
строки» в книге «Cracking the Coding Interview». При
решении этой задачи мы можем применить
разные подходы, причем пространственная
и временная сложность в них будет
отличаться. Давайте рассмотрим парочку
вариантов.

Первый подход: брутфорс

Брутфорс (англ. brute force — грубая сила) —
это обычно самый простой способ решения
любой задачи на белой доске, так что
будет полезным начать именно с него.
Имея брутфорс-решение, мы сможем
воспользоваться хотя бы им, если более
элегантные методы не сработают. Также
это хорошая практика в основах
программирования. Читая это решение,
вы лучше поймете, с какого конца вообще
надо браться за задачи.

Название «брутфорс» говорит само за
себя. Представьте, что у вас есть набор
пазлов, где все кусочки одного цвета.
Вам придется вслепую пробовать каждую
комбинацию, пока не найдете пару пазлов,
которые можно соединить. Что касается
нашей задачи, мы будем сверять каждый
символ в строке со всеми остальными,
пытаясь найти совпадения.

Начнем с определения метода (можете работать в Repl.it, а можете воспользоваться просто карандашом и бумагой). Наш метод будет принимать одну строку в качестве параметра. Ее мы обозначим как s.

def is_unique(s):
    pass

Дальше мы определим наш первый цикл for. Вообще у нас будут вложенные циклы, а этот будет перебирать все символы в строке до предпоследнего (включительно). Почему не до последнего? Потому что каждый из этих символов мы будем сравнивать с теми, которые идут после него, а за последним больше нет других символов.

def is_unique(s):
    for i in range(len(s) - 1):

Теперь давайте сделаем второй цикл for внутри первого. Он будет начинаться от следующей позиции в списке, которой мы назначим индекс j. Индекс j будет расти до конца списка, а элементы под этим индексом будут сравниваться с символом под индексом i. В случае совпадения мы вернем False — это будет означать, что не все символы в строке уникальны.

def is_unique(s):
    for i in range(len(s) - 1):
        for j in range(i + 1, len(s)):
            if s[j] == s[i]:
                return False

Наконец, нам нужно где-нибудь вернуть
True. Если вложенный цикл for успешно сравнил
все символы и не нашел совпадений,
значит, все символы в строке уникальны.
Поэтому мы возвращаем True за пределами
вложенного цикла.

def is_unique(s):
    for i in range(len(s) - 1):
        for j in range(i + 1, len(s)):
            if s[j] == s[i]:
                return False
    return True

Вот и все! Вызов is_unique("Hello") должен вернуть False, а is_unique("Bye") — True.

Временная и пространственная
сложность брутфорс-метода

Прежде всего, наше решение удовлетворяет
требованию «никаких дополнительных
структур данных». Мы просто перебираем
в цикле строку, не сохраняя информацию
в новой структуре. Это дает нам
пространственную сложность O(1), которая
не зависит от длины строки.

Как насчет временной сложности?
Представим наихудший случай. В строке
нет уникальных символов, поэтому
вложенный цикл отрабатывает все до
конца. Временная сложность здесь будет
примерно O(N2), несмотря на то, что мы
экономим некоторое время, проверяя
каждую пару только единожды. O(N2) это
ужасно. Но это, вероятно, наилучший
вариант, если нельзя создавать
дополнительные структуры данных или
модифицировать исходную строку.

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

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

Метод Python .sort() работает только со списками. Так что наша первая задача — превратить строку в список символов. Мы показываем, как это делается, что если вы дойдете до собеседования с решением задач у доски, такие вещи у вас должны уже от зубов отскакивать.

s_as_list = [char for char in s]

Цикл for перебирает все символы в строке s и возвращает каждый символ. Мы записываем результат в список, взяв цикл в квадратные скобки.

Превратив строку в список, мы можем вызвать метод sort().

def is_unique2(s):
    s_as_list = [char for char in s]
    s_as_list.sort()

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

    prev = ""
    for letter in s_as_list:

На каждой итерации нам нужно сделать
одно из двух:

  1. Если символ такой же, как и предыдущий,
    вернуть False.
  2. В противном случае сделать этот
    символ новым предыдущим символом.

Можно превратить это в предложение if. Давайте используем в качестве имени переменной letter, а не char, чтобы не путать с тем, что мы делали ранее, когда превращали строку в список.

    prev = ""
    for letter in s_as_list:
        if letter == prev:
            return False
        else: 
            prev = letter

Наконец, если цикл for успешно отработает и не найдет совпадений, мы вернем True за пределами цикла. Все вместе это выглядит так:

def is_unique2(s):
    s_as_list = [char for char in s]
    s_as_list.sort()
    prev = ""
    for letter in s_as_list:
        if letter == prev:
            return False
        else: 
            prev = letter
    return True

Временная сложность решения
с использованием метода sort()

Временная сложность этого решения зависит от временной сложности самого метода sort(). Python использует Timsort — гибрид сортировки слиянием и вставками (если вам это о чем-то говорит). Его временная сложность в среднем и наихудшем случае — O(N log N). Кроме того, мы перебираем список в цикле N раз, но этим можно пренебречь, потому что O(N log N) больше.

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

Решение, еще более оптимальное
с точки зрения временной сложности:
использование словаря

Давайте вообще отбросим запрет на
дополнительные структуры данных. Какое
решение еще можно предложить в таком
случае? В книге Cracking the Coding Interview первое
решение предполагает использование
массива с длиной 128 (длина всего алфавита
Unicode). Но если вы уже пользовались Python
пару раз, вы, вероятно, знакомы с такой
структурой как словарь.

В Python есть библиотека с дефолтным словарем — defaultdict. Она позволяет нам задавать значения по умолчанию: при вызове ключа, которого нет в словаре, будет создана пара из этого ключа и дефолтного значения. Это избавляет нас от необходимости проверять, есть ли ключ в списке, перед поиском его значения.

Мы можем назначить нашему словарю dd тип bool, таким образом дефолтное значение всегда будет False.

from collections import defaultdict

def is_unique3(s):
    dd = defaultdict(bool)

Теперь давайте напишем цикл for. Мы переберем в цикле все символы в строке, проверяя их значение. Если значение будет True, это будет означать, что такой символ нам уже попадался. В таком случае мы вернем False. Если значение будет False (а defaultdict «выдаст» его любому ключу, которого еще нет в словаре), мы присвоим этому символу значение True.

    for char in s:
        if dd[char]:
            return False
        dd[char] = True

Наконец, мы вернем True за пределами
цикла, если каждый символ встретится
только один раз.

Все вместе это выглядит следующим
образом:

def is_unique3(s):

    dd = defaultdict(bool)

    for char in s:
        if dd[char]:
            return False
        dd[char] = True
    return True

Временная сложность решения
со словарем

Мы перебираем список N раз, кроме того
доступ к каждому элементу словаря имеет
временную сложность O(1). Таким образом
временная сложность этого решения —
O(N), а это даже лучше, чем в предыдущем
способе. Работая над программами, вы
увидите, что компромиссы с пространственной
и временной сложностью — ваши постоянные
спутники, а то, какое решение считать
наилучшим, зависит от ситуации.

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