Problème : Étant donné une chaîne de caractères, trouver le premier caractère non répétitif et retourner son indice. Si aucun n'existe, retourner -1.
Exemples :
- Pour s = "leetcode", la sortie est 0
- Pour s = "loveleetcode", la sortie est 2
Contrainte : La chaîne ne contient que des lettres minuscules.
Solution 1 : Approche naïve avec boucle imbriquée
Cette méthode parcourt chaque caractère et compte ses occurrences en utilisant une boucle interne, ce qui est inefficace mais simple à comprendre.
class Solution:
def premierCaractereUnique(self, chaine: str) -> int:
longueur = len(chaine)
for idx in range(longueur):
car = chaine[idx]
occurrences = 0
for c in chaine:
if c == car:
occurrences += 1
if occurrences == 1:
return idx
return -1
Solution 2 : Utilisation de find et rfind
Cette méthode vérifie si un caractère apparaît une seule fois en comparant sa première et dernière occurrence à l'aide des fonctions find et rfind.
class Solution:
def premierCaractereUnique(self, chaine: str) -> int:
for pos in range(len(chaine)):
premiere = chaine.find(chaine[pos])
derniere = chaine.rfind(chaine[pos])
if premiere == derniere:
return pos
return -1
Solution 3 : Approche pythonique avec découpage
Cette approche vérifie si un caractère n'apparaît ni dans la partie gauche ni dans la partie droite de la chaîne par rapport à sa position actuelle.
class Solution:
def premierCaractereUnique(self, chaine: str) -> int:
longueur = len(chaine)
if longueur == 1:
return 0
for idx in range(longueur):
caractere = chaine[idx]
if caractere not in chaine[:idx] and caractere not in chaine[idx+1:]:
return idx
return -1
Solution 4 : Algorithme de hachage avec compteur
Cette méthode utilise un dictionnaire pour compter les occurrences de chaque caractère, puis parcourt la chaîne pour trouver le premier avec un compteur égal à 1.
class Solution:
def premierCaractereUnique(self, chaine: str) -> int:
from collections import Counter
compteur = Counter(chaine)
for idx, car in enumerate(chaine):
if compteur[car] == 1:
return idx
return -1