Maison > développement back-end > tutoriel php > Prenez K de chaque personnage de gauche et de droite

Prenez K de chaque personnage de gauche et de droite

DDD
Libérer: 2024-11-24 20:44:09
original
303 Les gens l'ont consulté

Take K of Each Character From Left and Right

2516. Prenez K de chaque personnage de gauche et de droite

Difficulté :Moyen

Sujets : Table de hachage, chaîne, fenêtre coulissante

Vous recevez une chaîne s composée des caractères « a », « b » et « c » et d'un entier non négatif k. Chaque minute, vous pouvez prendre soit le caractère le plus à gauche de s, soit le caractère le plus à droite de s.

Renvoyer le nombre minimum de minutes nécessaires pour que vous preniez au moins k de chaque caractère, ou renvoie -1 s'il n'est pas possible de prendre k de chacun personnage.

Exemple 1 :

  • Entrée : s = "aabaaaacaabc", k = 2
  • Sortie : 8
  • Explication : Prenez trois caractères à gauche de s. Vous avez maintenant deux caractères « a » et un caractère « b ».
    • Prenez cinq caractères à droite de s. Vous disposez maintenant de quatre caractères « a », deux caractères « b » et deux caractères « c ».
    • Un total de 3 5 = 8 minutes est nécessaire.
    • Il peut être prouvé que 8 est le nombre minimum de minutes nécessaires.

Exemple 2 :

  • Entrée : s = "a", k = 1
  • Sortie : -1
  • Explication : Il n'est pas possible de prendre un 'b' ou un 'c' donc retournez -1.

Contraintes :

  • 1 <= s.length <= 105
  • s se compose uniquement des lettres « a », « b » et « c ».
  • 0 <= k <= s.length

Indice :

  1. Commencez par compter la fréquence de chaque caractère et vérifiez si c'est possible.
  2. Si vous prenez x caractères du côté gauche, quel est le nombre minimum de caractères que vous devez prendre du côté droit ? Trouvez ceci pour toutes les valeurs de x dans la plage 0 ≤ x ≤ s.length.
  3. Utilisez une approche à deux points pour éviter de calculer plusieurs fois les mêmes informations.

Solution :

Nous pouvons utiliser une technique de fenêtre coulissante avec deux pointeurs pour trouver le nombre minimum de minutes nécessaires pour prendre au moins k de chaque caractère (« a », « b », « c ») à gauche et à droite du chaîne.

Répartition du problème :

  • On nous donne une chaîne s contenant uniquement « a », « b » et « c ».
  • Nous devons prendre au moins k occurrences de chaque caractère, soit à partir des caractères les plus à gauche, soit à l'extrême droite de la chaîne.
  • Nous devons déterminer le nombre minimum de minutes nécessaires pour y parvenir ou renvoyer -1 si c'est impossible.

Approche:

  1. Vérifications initiales :

    • Si k == 0, on peut retourner directement 0 puisqu'aucun caractère n'est requis.
    • Si k dépasse le nombre d'occurrences d'un caractère dans la chaîne, renvoie immédiatement -1.
  2. Compte de fréquence :

    • Nous devons compter combien de fois « a », « b » et « c » apparaissent dans la chaîne s pour nous assurer qu'il est même possible de rassembler k de chaque caractère.
  3. Technique de la fenêtre coulissante :

    • Utilisez une approche par fenêtre coulissante avec deux pointeurs (gauche et droite).
    • Maintenez deux pointeurs et faites-les glisser des deux extrémités de la chaîne pour rassembler les caractères requis.
    • Pour chaque nombre de caractères pris à gauche, calculez le nombre minimum de caractères qui doivent être pris à droite pour satisfaire à l'exigence.
  4. Optimisation :

    • Au lieu de recalculer le nombre de caractères à plusieurs reprises pour chaque fenêtre, nous pouvons suivre le nombre de caractères à mesure que nous agrandissons ou réduisons la fenêtre.

Implémentons cette solution en PHP : 2516. Prenez K de chaque personnage de gauche à droite






Explication:

  1. Configuration initiale :

    • Nous comptons les occurrences de « a », « b » et « c » dans la chaîne entière pour nous assurer qu'il est possible de rassembler au moins k de chaque caractère.
    • Si un nombre de caractères est inférieur à k, renvoie -1.
  2. Fenêtre coulissante :

    • Nous utilisons deux pointeurs (gauche et droite) pour créer une fenêtre coulissante des deux extrémités.
    • On agrandit la fenêtre en déplaçant le pointeur droit et on incrémente le nombre de caractères rencontrés.
    • Une fois que nous avons au moins k de chaque caractère dans la fenêtre actuelle, nous essayons de réduire la fenêtre de gauche pour minimiser le nombre de minutes (caractères pris).
  3. Réduire le temps :

    • Nous suivons le nombre minimum de minutes requises en comparant la taille de la fenêtre à chaque fois que nous collectons k caractères de tous types.

Complexité temporelle :

  • Le comptage des caractères prend initialement O(n).
  • L'opération de fenêtre coulissante prend O(n), car les pointeurs gauche et droit se déplacent une fois sur la chaîne.
  • La complexité temporelle globale est O(n).

Cas extrêmes :

  • Si k == 0, renvoie 0.
  • S'il est impossible de prendre k de chaque caractère, retournez -1.

Liens de contact

Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !

Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :

  • LinkedIn
  • GitHub

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal