Count a Character
Дана строка s и одна буква c. Верните количество появлений c в s. Сопоставление чувствительно к регистру: B и b — разные символы.
Функция
- sstring
- строка английских букв для поиска
- cstring
- единственная буква, которую нужно посчитать
- Возвращаетinteger
- сколько символов в s равны c
Ограничения
1 ≤ s.length ≤ 5 × 104sсодержит только английские буквы (a–z,A–Z).c— это ровно одна английская буква.
Примеры
- Ввод
- s = "Mississippi"c = "s"
- Вывод
- 4
- Пояснение
- В слове
Mississippiбукваsстоит на индексах 2, 3, 5 и 6, поэтому ответ — 4.
- Ввод
- s = "Banana"c = "b"
- Вывод
- 0
- Пояснение
Bananaначинается с заглавнойB, а ты ищешь строчнуюb. Совпадений нет, поэтому ответ — 0.
Дополнительный вопрос
Что, если c может быть словом из нескольких букв, например ss? Считаются ли пересекающиеся совпадения и как изменится ваш цикл?
Подсказки
Открывайте по одной. Каждая подсказывает чуть больше.
Чтобы узнать, сколько раз встречается
c, на какие символы вsнужно посмотреть?Сравните каждый символ
sсcименно в том виде, в каком они есть. Здесь заглавные и строчные буквы считаются разными символами.Храните счётчик, который начинается с 0. Пройдите по строке один раз и прибавляйте 1 каждый раз, когда текущий символ равен
c.
Решение
Любой символ в s может быть c, поэтому проверь каждый символ один раз и посчитай совпадения. Учитывай регистр: заглавная буква — это другой символ.
Удалите каждую c и сравните длины
Идея
Создайте копию s, удалив из неё все c. Каждое удаление укорачивает копию на один символ, поэтому разница в длине и есть количество. Для Mississippi копия будет Miiippi: 11 минус 7 равно 4.
Время выполнения составляет O(n), но для копии требуется дополнительная память O(n), которая счётчику не нужна.
Алгоритм
- Создай копию
s, пропустив каждый символ, равныйc. - Измерь длину
sи длину копии. - Верни длину
sминус длина копии.
def countChar(s, c):
# Every c that disappears makes the string one character shorter.
without = s.replace(c, "")
return len(s) - len(without)Один проход со счётчиком
Идея
Считайте символы на ходу, не создавая копию. Счётчик начинается с 0 и увеличивается на 1 для каждого символа, равного c. Простое сравнение на равенство не позволяет заглавной букве совпасть со строчной.
Каждый символ сравнивается один раз, и хранится только счётчик: время O(n), память O(1). Ни одно решение не работает быстрее, чем за O(n), потому что пропущенный символ может оказаться ещё одной c.
Алгоритм
- Считай целевую букву из
cи установиcount = 0. - Просматривай
sпо одному символу за раз. - Если символ совпадает с целевым, прибавь 1 к
count. - Верни
count.
def countChar(s, c):
count = 0
for ch in s:
if ch == c:
count += 1
return count
Ловушки и крайние случаи
- Игнорирование регистра. Перевод обеих сторон в нижний регистр приводит к тому, что
Bananaиbвозвращают 1; правильный ответ — 0. - Сравнение символа со строкой. В Java, C, C++, C# и Go
cпередаётся как строка, аs[i]илиs.charAt(i)— это один символ. Получиc[0](илиc.charAt(0)) один раз перед циклом. - Сравнение строк с помощью
==в Java.String.valueOf(s.charAt(i)) == cсравнивает идентичность объектов и почти всегда возвращает false. Сравнивай значения типаchar. - Вызов
strlen(s)в условии цикла в C. Функция повторно сканирует строку на каждом шаге, поэтому обработка5 × 10^4символов требует примерно2.5 × 10^9шагов.
Частые вопросы3
Как подсчитать количество вхождений символа в строке?
Пройдите по строке один раз, используя счётчик, который начинается с 0, и увеличивайте его на 1 каждый раз, когда текущий символ совпадает с нужным. Это займёт время O(n) и дополнительную память O(1). Для подсчёта без учёта регистра сначала переведите строку и букву в нижний регистр.
Можно ли использовать встроенную функцию подсчёта на собеседовании?
Обычно да, если ты можешь объяснить, сколько это стоит. str.count в Python и подобные функции всё равно просматривают всю строку, поэтому их сложность — O(n). Будь готов написать цикл, если интервьюер попросит.
Как бы ты посчитал все символы сразу?
Сделайте один проход и подсчитайте количество вхождений каждого символа в хеш-таблице или в массиве из 52 счётчиков для английских букв. После этого прохода количество вхождений любой буквы можно узнать за один поиск. Используйте этот способ, если вас спрашивают о многих буквах в одной и той же строке.
Похожие задачи
Задачи на те же идеи. Решите две или три, и приём запомнится.
def countChar(s, c):
# Напишите код здесьТест #1
Тест #2
Аргументы
s = "Mississippi" c = "s"
Ожидаемый вывод
4