Как найти уникальный символ в строке

The purpose of this article is to find unique characters in a string using JavaScript. We have a few methods to find unique characters in a string using JavaScript which are described below.

Example:

Input:  Geeksforgeeks
Output: Geksforg

Input:  Geeksforgeeks is a great site for computer science
Output: Geksforg Iaticmpun

To achieve this, we have the following approaches:

Approach 1: This is a naive approach to find the unique characters from a string. In this approach, we create a variable name uniq and we are iterating over the string using the for loop and at every iteration, we are checking if the uniq contains the character.

Example: This example shows the above-explained approach.

Javascript

<script>

    function findUnique(str){

      let uniq = "";

      for(let i = 0; i < str.length; i++){

        if(uniq.includes(str[i]) === false){

          uniq += str[i]

        }

      }

      return uniq;

    }

    console.log(findUnique("Geeksforgeeks"))

    console.log(findUnique("Geeksforgeeks Is a great site for computer science"))

</script>

Output:

"Geksforg"

"Geksforg Iaticmpun"

Approach 2: In this method, we use the set data structure. The set data structure contains only unique values, and we take the advantage of it. So to extract the unique values from the string using Set we follow the steps below.

  • Using the split() method convert the string into an array.
  • Create a Set using new Set() and pass the converted array into it.
  • Now convert the set into an array using the spread operator e.g: […set]
  • And then join that array to make a string.

Example: This example shows the above-explained approach.

Javascript

<script>

    function findUnique(str){

      str = str.split("")

      str = new Set(str);

      str = [...str].join("");

      return str;

    }

    console.log(findUnique("Geeksforgeeks"))

    console.log(findUnique("Geeksforgeeks Is a great site for computer science"))

</script>

Output:

"Geksforg"

"Geksforg Iaticmpun"

Approach 3: In this approach first, we convert the string into an array using the spread operator e.g. […str] and then we apply the reduce method on that array. 

Example: This example shows the above-explained approach.

Javascript

<script>

    function findUnique(str){

      return [...str].reduce((acc, curr)=>{

        return acc.includes(curr) ?  acc  :  acc + curr;

      }, "")

    }

    console.log(findUnique("Geeksforgeeks"))

    console.log(findUnique("Geeksforgeeks Is a great site for computer science"))

</script>

Output:

"Geksforg"
"Geksforg Iaticmpun"

Approach-4: In this approach, we will use a for-loop in order to iterate over the complete string and then by using the indexOf() method we will check the index of each and every character (using charAt() method) of the string which is either repeated or not repeated and then in an empty string (which we will declare initially) we will store all the unique characters.

Example: This example shows the above-explained approach.

Javascript

<script>

    let uniqueCharacters = (stringg) => {

      let unique_characters = "";

      for (let i = 0; i < stringg.length; i++) {

     if (unique_characters.indexOf(stringg.charAt(i)) < 0) {

       unique_characters += stringg.charAt(i);

     }

      }

      return unique_characters;

    };

    console.log(uniqueCharacters("Geeksforgeeks"));

</script>

Output:

Geksforg

Last Updated :
06 Jan, 2023

Like Article

Save Article

есть строка a = “a14b6fh”, как узнать, что все символы уникальны, используя множества и списки.
Сделал способом, приведенным ниже, но не совсем соответствует условию.

a = "a14b6fh"
b = []
total = True
for element in a:
    if element in b:
        total = False
    else:
        b += element
if total == True:
    print("Да, все символы уникальны")
else:
    print("Нет, символы не уникальны")

задан 16 апр 2022 в 17:12

Владимир's user avatar

2

arr ="a14b6fh"
setarr = set(arr)
if len(arr) == len(setarr):
    print("Все элементы уникальны")
else:
    print("Есть одинаковые")

ответ дан 16 апр 2022 в 18:54

Dart_sinister's user avatar

2

Можно также использовать метод cловаря fromkeys() для удаления дублей. Идея такая, что ключи словаря могут быть только уникальными. Если использовать set(), то в книгах пишут, что изначальный порядок элементов в коллекции может быть нарушен.

 b = [1,2,3,3,3,4,5]
 result = list(dict.fromkeys(b))
 print('*',result)
 
 * [1, 2, 3, 4, 5]

ответ дан 16 апр 2022 в 19:12

Zhenia Kviatkivskyi's user avatar

3

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

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

Считаем уникальные символы при помощи множества

Чтобы подсчитать количество уникальных символов в строке, сперва используйте функцию set() для преобразования строки во множество уникальных символов. Затем при помощи функции len() определите количество элементов множества.

my_str = 'bobby'

result = len(set(my_str))
print(result)  # 3

Функция set() принимает итерируемый объект и возвращает новый объект класса 'set' (т.е. множество) с элементами исходного объекта. Множество – это неупорядоченная коллекция уникальных элементов, поэтому преобразование строки во множество удаляет все повторы символов.

my_str = 'bobby'

print(set(my_str)) 

# Вывод:
# {'y', 'b', 'o'}

Последний шаг – использование функции len() для получения общего количества элементов множества.

my_str = 'bobby'

result = len(set(my_str))
print(result)  

# Вывод:
# 3

Функция len() возвращает длину (количество элементов) объекта. Аргументом, который принимает функция, может быть последовательность (например, строка, кортеж или список) или коллекция (словарь, множество, замороженное множество).

Если вам нужно не посчитать уникальные символы в строке, а получить их, используйте вместо функции len() метод str.join().

my_str = 'bobby'

result = ''.join(set(my_str))
print(result)  

# Вывод:
# byo

Метод str.join() принимает в качестве аргумента итерируемый объект и возвращает строку, которая является конкатенацией строк в итерируемом объекте. Строка, к которой обращается метод, используется в качестве разделителя между элементами.

Примечание редакции: подробнее о методе join() можно почитать в статье “Метод join() и объединение строк в Python”.

Считаем уникальные символы в строке с помощью dict.fromkeys()

При таком подходе сперва нужно создать из строки словарь при помощи метода dict.fromkeys(). Затем, используя функцию len(), можно получить количество элементов словаря.

my_str = 'bobby'


result = len(dict.fromkeys(my_str))
print(result)  


# Вывод:
# 3

Метод dict.fromkeys принимает итерируемый объект и значение и создает словарь. Ключами этого словаря будут элементы итерируемого объекта. Все ключи будут иметь одно значение – то, которое было передано dict.fromkeys() в качестве аргумента. Если значение не передано, по умолчанию используется None.

my_str = 'bobby'

print(dict.fromkeys(my_str))

# Вывод:
# {'b': None, 'o': None, 'y': None}

Ключи словаря уникальны, поэтому все дублирующиеся символы удаляются.

Если вам нужно не посчитать уникальные символы в строке, а получить их, используйте вместо функции len() метод str.join() .

my_str = 'bobby'


result = ''.join(dict.fromkeys(my_str).keys())
print(result)  

# Вывод:
# boy

При помощи метода dict.keys() мы получили ключи словаря, а при помощи str.join() объединили их в строку.

Начиная с Python 3.7 словари сохраняют порядок вставки ключей.

Подсчет уникальных символов с помощью цикла for

Чтобы посчитать уникальные символы в строке при помощи цикла for, нужно проделать следующие шаги:

  1. Объявите новую переменную, которая будет хранить пустой список.
  2. Используйте цикл for для итерации по строке.
  3. Используйте метод list.append() для добавления всех уникальных символов в список.
  4. Используйте функцию len() для получения длины списка.
my_str = 'bobby'

unique_chars = []

for char in my_str:
    if char not in unique_chars:
        unique_chars.append(char)

print(len(unique_chars))  # 3
print(unique_chars)  # ['b', 'o', 'y']

Мы использовали цикл for для перебора символов строки. На каждой итерации мы используем оператор not in, чтобы проверить, нет ли символа в списке. Если такого символа в списке нет, мы добавляем его в конец списка при помощи метода list.append().

Примечание редакции: познакомиться с оператором not in можно в статье “Операторы in и not in в Python”.

my_list = ['bobby', 'hadz']

my_list.append('com')

print(my_list)  

# Вывод:
# ['bobby', 'hadz', 'com']

Последний шаг – использование функции len() для получения длины списка уникальных символов.

Перевод статьи Borislav Hadzhiev «Count the number of unique characters in a String in Python».

Маруся171996

3 / 3 / 0

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

Сообщений: 34

1

Найти уникальные символы в строке

31.10.2022, 01:09. Показов 690. Ответов 1

Метки c# (Все метки)


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

Доброго времени суток! Начинаю знакомиться с программированием. Возникла задача: найти уникальные символы в строке, подсчитать их и вывести. Изучали библиотеки и на их основе нужно сделать. Проблема с используемыми методами и как реализовать. Можете на пальцах объяснить новичку?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
 
string buffer = "Hello world";
char[] ch = buffer.ToCharArray();
Dictionary<char, int> dict = new Dictionary<char, int>();
 
for (int i = 0; i < ch.Length; i++)
{
    if (dict.ContainsValue(ch[i]))
 {
        dict.TryGetValue(ch[i], out i);
    }
    else
    {
        dict.Add(ch[i], 1);
    }
 
    Console.WriteLine("Количество символов {0} = {1}", ch, dict);
}



0



andreyfreelans

411 / 227 / 136

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

Сообщений: 4,579

31.10.2022, 08:48

2

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        static void Main(string[] args)
        {
            string str = "Hello world";
            Console.WriteLine(str);
            int count = 0;
            int tmp;
            for (int i = 0; i < str.Length; i++)
            {
                tmp = 0;
                for (int j = 0; j < str.Length; j++)
                {
                    if (str[i] == str[j])
                    {
                        tmp++;
                    }
                }
                if (tmp == 1)
                {
                    Console.WriteLine("Уникальный символ {0}", str[i]);
                    count++;
                }
            }
            Console.WriteLine("Всего {0} уникальных символов", count);
            Console.ReadKey();
        }



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

31.10.2022, 08:48

2

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