API de Strings do Python para Entrevistas
Pratique padrões com split, join, replace, find, ord/chr e formatação de strings que aparecem em problemas de análise e transformação.
API de Strings do Python para Entrevistas é uma aula grátis de DSA Interview Prep no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de DSA Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de DSA Interview Prep inclui 4 aulas no total.
As cadeias de caracteres são imutáveis em Python
As cadeias de caracteres do Python são imutáveis — não é possível alterar um caractere no próprio lugar. Toda operação sobre uma cadeia que parece modificá-la, na verdade, cria uma nova cadeia. Isso significa que s[0] = 'X' gera um TypeError. Quando precisar manipular uma cadeia no próprio lugar, converta-a primeiro em uma lista de caracteres, faça o trabalho e depois use ''.join(chars) para reconstruí-la. Esse é o padrão usado em entrevistas para problemas de modificação de cadeias de caracteres.
s = 'hello'
# s[0] = 'H' # TypeError!
# In-place mutation pattern:
chars = list(s)
chars[0] = 'H'
result = ''.join(chars)
print(result) # 'Hello'
# Reversing a string
print(s[::-1]) # 'olleh'
print(''.join(reversed(s))) # 'olleh'split() e join(): análise e construção
s.split(sep) divide uma cadeia usando um delimitador e retorna uma lista de subcadeias. sep=None (padrão) divide em qualquer espaço em branco e descarta cadeias vazias — ideal para analisar uma entrada separada por espaços. 'sep'.join(iterable) concatena cadeias com um separador entre elas. A expressão idiomática ' '.join(words) é a forma eficiente de construir uma cadeia separada por espaços a partir de uma lista — nunca use + em um laço.
# split
sentence = ' hello world '
words = sentence.split() # ['hello', 'world']
print(words)
csv = 'a,b,c,d'
parts = csv.split(',') # ['a', 'b', 'c', 'd']
print(parts)
# join
print(' '.join(words)) # 'hello world'
print(','.join(['x','y','z'])) # 'x,y,z'
# Reverse words in a sentence
print(' '.join(sentence.split()[::-1])) # 'world hello'find(), consulta por índice e operador de pertencimento
s.find(sub) retorna o índice da primeira ocorrência de sub ou -1 se não for encontrada. s.index(sub) faz o mesmo, mas gera um ValueError se a ocorrência estiver ausente — prefira find no código de entrevistas para evitar exceções não tratadas. O operador in para cadeias realiza uma busca de subcadeia O(n×m), assim como find. Use os parâmetros opcionais start e end para pesquisar dentro de um trecho sem copiá-lo.
s = 'abcabcabc'
print(s.find('bc')) # 1 (first occurrence)
print(s.find('bc', 2)) # 4 (search from index 2)
print(s.find('xyz')) # -1 (not found)
print('abc' in s) # True
# Count occurrences manually
count = 0
start = 0
while True:
idx = s.find('bc', start)
if idx == -1: break
count += 1
start = idx + 1
print(count) # 3replace(), strip() e métodos de maiúsculas e minúsculas
s.replace(old, new, count=-1) retorna uma nova cadeia com todas as ocorrências (ou as primeiras count) substituídas. s.strip() remove espaços em branco no início e no final (ou os caracteres especificados). Os métodos de maiúsculas e minúsculas lower(), upper(), capitalize() e swapcase() criam novas cadeias — lembre-se de guardar esses valores retornados, pois eles não modificam a cadeia. Normalizar maiúsculas e minúsculas antes da comparação é essencial em problemas que ignoram diferenças entre maiúsculas e minúsculas.
s = ' Hello, World! '
print(s.strip()) # 'Hello, World!'
print(s.strip().lower()) # 'hello, world!'
print('banana'.replace('a', 'o')) # 'bonono'
print('banana'.replace('a', 'o', 2)) # 'bonona'
# Normalise for comparison
def same_ignoring_case(a, b):
return a.lower() == b.lower()
print(same_ignoring_case('Racecar', 'racecar')) # Truestartswith(), endswith() e isalnum()
Os métodos de cadeia que funcionam como predicados retornam valores booleanos e são O(k), onde k é o comprimento do padrão. s.startswith(prefix) e s.endswith(suffix) aceitam tuplas para várias alternativas. s.isalpha(), s.isdigit(), s.isalnum() e s.isspace() verificam classes de caracteres. Eles são usados em problemas de entrevistas sobre palíndromos válidos, números válidos e análise de endereços URL.
print('hello'.startswith('hel')) # True
print('hello'.endswith(('lo', 'la'))) # True
# isalnum for palindrome filtering
def clean(s):
return ''.join(c.lower() for c in s if c.isalnum())
print(clean('A man, a plan, a canal: Panama'))
# 'amanaplanacanalpanama'
print(clean('123abc!@#'))
# '123abc'Códigos ASCII e aritmética de caracteres
ord(c) retorna o ponto de código Unicode do caractere c. chr(n) converte um inteiro novamente em caractere. Para letras minúsculas, ord(c) - ord('a') fornece um valor de 0 a 25 — uma forma simples de construir vetores de frequências de tamanho fixo 26 sem um mapa de dispersão, que na prática é mais rápida para o alfabeto inglês. Essa técnica aparece em problemas de anagramas e palíndromos.
print(ord('a')) # 97
print(ord('z')) # 122
print(chr(65)) # 'A'
# Frequency array for lowercase letters
def char_freq(s):
freq = [0] * 26
for c in s:
freq[ord(c) - ord('a')] += 1
return freq
print(char_freq('anagram')) # [3,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0]
# index 0='a'(3), 6='g'(1), 12='m'(1), 17='r'(1)Formatação de cadeias de caracteres para a saída
Em entrevistas de programação, às vezes uma saída organizada é importante. O Python oferece três estilos de formatação: formatação com % (antiga), .format() (clássica) e cadeias f (modernas e preferidas). As cadeias f são as mais legíveis e aceitam expressões diretamente: f'{value:.2f}' formata um número de ponto flutuante com 2 casas decimais. Saber formatar números, preencher cadeias e imprimir tabelas rapidamente reduz o tempo de depuração sob pressão.
name = 'Alice'
score = 95.678
# f-string (preferred in interviews)
print(f'{name}: {score:.1f}') # Alice: 95.7
print(f'{name:>10}: {score:05.1f}') # right-align
# Zero-pad an integer
print(f'{42:04d}') # 0042
# Join and format a list
nums = [1, 2, 3, 4]
print(', '.join(str(n) for n in nums)) # '1, 2, 3, 4'Construção eficiente de cadeias com join()
A concatenação de cadeias com + em um laço cria uma nova cadeia a cada iteração, custando O(n²) no total para n caracteres. O padrão correto é: adicione as partes a uma lista e chame ''.join(parts) no final, obtendo O(n). Este é um dos antipadrões de desempenho mais comuns do Python. Em uma entrevista, mencionar essa troca demonstra que você entende o modelo de memória do Python.
# SLOW: O(n^2) due to repeated string allocation
def build_bad(chars):
s = ''
for c in chars:
s += c # creates a new string each time!
return s
# FAST: O(n)
def build_good(chars):
parts = []
for c in chars:
parts.append(c)
return ''.join(parts) # single allocation
# Or even more concise:
def build_best(chars):
return ''.join(chars)
print(build_best(['h','e','l','l','o'])) # 'hello'Analisar inteiros e números de ponto flutuante em cadeias de caracteres
Converter entre cadeias e números é fundamental em problemas de análise. int(s) e float(s) analisam cadeias numéricas; eles geram ValueError para entradas inválidas. Para uma análise mais segura, use um bloco de tentativa e exceção. Os métodos de cadeia isdigit() e isnumeric() fazem uma pré-validação antes da conversão. Problemas de conversão de cadeia para inteiro exigem lidar com espaços iniciais, sinais e estouro.
def my_atoi(s):
s = s.lstrip() # remove leading spaces
if not s: return 0
sign = 1
idx = 0
if s[0] in '-+':
sign = -1 if s[0] == '-' else 1
idx = 1
num = 0
while idx < len(s) and s[idx].isdigit():
num = num * 10 + int(s[idx])
idx += 1
result = sign * num
INT_MAX, INT_MIN = 2**31 - 1, -(2**31)
return max(INT_MIN, min(INT_MAX, result))
print(my_atoi(' -42')) # -42
print(my_atoi('4193 with words')) # 4193Fatiamento de cadeias de caracteres em problemas de algoritmos
O fatiamento de cadeias é usado constantemente, mas tem custos ocultos: s[i:j] cria uma nova cadeia de comprimento j-i em tempo O(j-i). Quando precisar passar subcadeias para funções recursivas, considere passar índices (início, fim) em vez da subcadeia propriamente dita, para evitar o custo de alocação O(n²). Essa otimização é importante em problemas como o da subcadeia palindrômica mais longa, nos quais muitas subcadeias são testadas.
# Naive: O(n^3) because slicing inside nested loops
def is_palindrome_naive(s):
return s == s[::-1] # O(n) slice + O(n) compare
# Pass indices to avoid allocating substrings
def is_palindrome_range(s, left, right):
while left < right:
if s[left] != s[right]:
return False
left += 1; right -= 1
return True # O(right-left) time, O(1) space
print(is_palindrome_range('racecar', 0, 6)) # True
print(is_palindrome_range('hello', 0, 4)) # FalseReferência rápida de strings para entrevistas
Mantenha estes métodos de strings organizados mentalmente para entrevistas:
split / join— analisar e construirstrip / lstrip / rstrip— remover espaços em brancolower / upper— normalizar maiúsculas e minúsculasfind / index— localizar subcadeiasreplace— fazer substituiçõesisalnum / isalpha / isdigit— verificar classes de caracteresord / chr— fazer aritmética com ASCII em problemas de alfabeto fixostartswith / endswith— verificar prefixos e sufixos
# Combining methods: reverse words, preserve spaces
def reverse_words(s):
return ' '.join(reversed(s.split()))
print(reverse_words(' hello world '))
# 'world hello'
# Check anagram using sorted strings
def is_anagram(s, t):
return sorted(s) == sorted(t)
print(is_anagram('anagram', 'nagaram')) # True
print(is_anagram('rat', 'car')) # FalseVerificação rápida
Verifique sua compreensão dos conceitos de Estruturas de Dados & Algoritmos — Preparação para Entrevistas de Programação apresentados nesta lição.
Recapitulação da lição
Nesta lição, você aprendeu que: as strings do Python são imutáveis — para modificá-las, é necessário convertê-las em uma lista, fazer as alterações e depois juntá-las novamente; ord/chr permitem usar vetores de frequências de tamanho fixo 26 em problemas com letras minúsculas, que são mais rápidos do que tabelas de dispersão para alfabetos limitados; e construir strings com + em um laço custa O(n²) — sempre acumule os elementos em uma lista e use ''.join() no final para obter O(n). Em seguida, exploraremos a técnica da janela deslizante para problemas com subcadeias.
Perguntas Frequentes
A aula “API de Strings do Python para Entrevistas” é grátis?
Sim — o texto completo de “API de Strings do Python para Entrevistas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de DSA Interview Prep, atualize para CoddyKit PRO. O curso de DSA Interview Prep inclui 4 aulas no total.
O que vou aprender em “API de Strings do Python para Entrevistas”?
Pratique padrões com split, join, replace, find, ord/chr e formatação de strings que aparecem em problemas de análise e transformação. Você pratica DSA Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar DSA Interview Prep?
Nenhuma experiência prévia é necessária. DSA Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “API de Strings do Python para Entrevistas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de DSA Interview Prep?
Sim. Cada aula de DSA Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- API de Strings do Python para Entrevistas
- Janela Deslizante para Substrings
- Anagramas e Mapas de Frequência de Caracteres
- Codificação, Reversão e Palíndromos de Strings