Как найти одинаковые символы в строке питон

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

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

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

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.2k5 золотых знаков20 серебряных знаков55 бронзовых знаков

1

  • 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

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

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

12 часов

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

12 часов

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

22 часа

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

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

YanchEz

0 / 0 / 0

Регистрация: 21.08.2022

Сообщений: 4

1

Строка: Найти все повторяющиеся символы и заменить их

21.08.2022, 13:58. Показов 3796. Ответов 8

Метки python, циклы for (Все метки)


Студворк — интернет-сервис помощи студентам

День добрый! Подскажите, пожалуйста, как найти ВСЕ ПОВТОРЯЮЩИЕСЯ символы в строке и заменить их на то, что я хочу? На данный момент программа находит только один такой символ (либо же только вставляет один в p), либо ищет количество этих повторяющихся символов через str.count(), что бесполезно, потому что нужны индексы, а она их не возвращает..

Python
1
2
3
4
5
6
7
8
9
for i in range(rand):
    print('Попыток: ', rand-i)
    inp = input('Введи букву, которая может быть в слове: ')
    if inp in l:
        index = l.find(inp)
        p[index] = inp
        print(p)
    else:
        print('Такой буквы в слове нет!')



0



Модератор

Эксперт функциональных языков программированияЭксперт Python

35577 / 19475 / 4073

Регистрация: 12.02.2012

Сообщений: 32,510

Записей в блоге: 13

21.08.2022, 14:30

2

Вот дана строка «Hello world». Что должно получиться?



0



Mikail7D6

beginner

296 / 208 / 98

Регистрация: 02.08.2022

Сообщений: 336

21.08.2022, 15:22

3

YanchEz, Если вам надо отследить все одинаковые символы из некой строки и их удалить к примеру(или заменить), то как-то так:
строка — азбука, символ — а, вывод — збук

Python
1
2
3
4
s = input()
for i in range(s.count('а')):
    s = s.replace('а', '') 
print(s)



0



iSmokeJC

Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

16268 / 9024 / 2605

Регистрация: 21.10.2017

Сообщений: 20,731

21.08.2022, 16:25

4

Liakim2006, очень плохо.
1. replace и так меняе все, что находит. Т.о. цикл не имеет смысла.
2. для начала нужно, как минимум, определить — что именно «а» появляется в слове более одного раза

Добавлено через 2 минуты
Если развить эту мысль, то

Python
1
2
3
4
5
s = 'azbuka'
for i in set(s):
    if s.count(i) > 1:
        s = s.replace(i, '*')
print(s)  #  *zbuk*



0



0 / 0 / 0

Регистрация: 21.08.2022

Сообщений: 4

22.08.2022, 14:33

 [ТС]

5

Дело в том, что str.replace() скорее всего у меня не получится здесь использовать. Удобнее всего было бы применить list.index(), но проблема в том, что метод возвращает всего одно — первое вхождение, а последующие игнорирует. Мне кажется этот момент очень неудобно реализован в питоне, ну либо, что очень вероятно, мне просто не хватает думалки и опыта.



0



Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

16268 / 9024 / 2605

Регистрация: 21.10.2017

Сообщений: 20,731

22.08.2022, 14:35

6

Цитата
Сообщение от YanchEz
Посмотреть сообщение

str.replace() скорее всего у меня не получится здесь использовать

почему?



0



0 / 0 / 0

Регистрация: 21.08.2022

Сообщений: 4

22.08.2022, 14:42

 [ТС]

7

У меня есть 3 основные переменные — в первую входит случайное слово из списка, во вторую идут случайно выбранные буквы из этого слова, а в третью я кладу (всё слово) минус (случайно выбранные буквы), то есть они исчезают оттуда. Потом идёт input() желаемой буквы, которая может быть в этом слове, и далее идёт проверка на наличие этой буквы в изначальной переменной, где слово написано полностью. И тут пока сама сложность — если input(*символ*) там присутствует, то должна быть выведена (третья переменная)+(input(*символ*)), и всё работает, пока в слове эта буква одна. Если их >= 2, то возвращается это слово только с одной вставленной буквой, а нужно 2 или более.



0



iSmokeJC

Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

16268 / 9024 / 2605

Регистрация: 21.10.2017

Сообщений: 20,731

22.08.2022, 14:50

8

Какая-то лютая дичь

Python
1
2
3
4
5
6
7
8
9
10
11
var1 = 'thisissomeworld'
var2 = 'iso'
var3 = ''.join(i for i in var1 if i not in var2)
var4 = input('Letter: ')  #s for example
result = var3 + var4 * var1.count(var4)
 
print(var1)
print(var2)
print(var3)
print(var4)
print(result)

Название: изображение_2022-08-22_145021263.png
Просмотров: 97

Размер: 11.0 Кб



1



YanchEz

0 / 0 / 0

Регистрация: 21.08.2022

Сообщений: 4

26.08.2022, 20:05

 [ТС]

9

кого интересует ответ на тему — всё легко и просто:

Python
1
2
3
4
5
6
7
if inp in l:
        for k in range(0, len(l)-2):
            if inp == l[k]:
                p[k] = inp
                print(p)
        else:
            continue



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

26.08.2022, 20:05

9

Давайте решим простую задачку, связанную с обработкой строк в 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), а это даже лучше, чем в предыдущем
способе. Работая над программами, вы
увидите, что компромиссы с пространственной
и временной сложностью — ваши постоянные
спутники, а то, какое решение считать
наилучшим, зависит от ситуации.

Понравилась статья? Поделить с друзьями:
  • Как центр занятости поможет найти работу
  • Как составить договор доставки товара
  • Мореный дуб как найти в лесу
  • Как найти весь путь фронтовика
  • Как найти потенциал через емкость