Je me demandais, car je ne pouvais pas trouver de sujets similaires, quelle était la meilleure façon de trouver des modèles de chaîne continue dans la chaîne et de les effacer.

Ce que je veux dire par là, c'est: j'ai une chaîne: "AAAAaaCCCCCCcDDDEEEE", et je voudrais trouver la même chaîne continue la plus longue et ce serait bei puisque C se produit 6 fois, puis la supprimer de la chaîne pour obtenir "AAAAaacDDDEEEE", puis répétez l'opération jusqu'à ce qu'il n'y ait qu'une seule chaîne continue. J'ai essayé de le faire moi-même, mais il semble prendre plus de lignes de code que sa simplicité l'exige,

Veuillez aider

0
Przemo 19 nov. 2018 à 20:42

3 réponses

Meilleure réponse

Vous pouvez trouver des caractères continus et les remplacer par une chaîne vide.

var string = "AAAAaaCCCCCCcDDDEEEE",
    longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);
    
console.log(longest);

string = string.replace(longest, '');

console.log(string);

Avec une fonction.

function remove(string) {
    var longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);

    while (longest.length > 1) {
        string = string.replace(longest, '');
        longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);
    }
    return string;
}
    
console.log(remove("AAAAaaCCCCCCcDDDEEEE"));
3
Nina Scholz 19 nov. 2018 à 21:32

Vous pouvez utiliser une expression rationnelle pour obtenir un tableau de chaînes. Obtenez la longueur de la chaîne la plus longue avec {{ X0}} et {{ X1}}. Utilisez Array.filter() pour supprimer les chaînes les plus longues, puis les combiner en une chaîne avec Array.join().

Cela gérera plusieurs longues chaînes de même longueur.

const removeLongest = (str) => {
  const chains = str.match(/(.)\1*/g); // get an array of chains
  const longest = Math.max(...chains.map(s => s.length)); // find the longest chain length
  return chains.filter(({ length }) => length !== longest) // remove longest chains
    .join(''); // convert array back to string
};
   
console.log(removeLongest('AAAAaaCCCCCCcDDDEEEE')); // AAAAaacDDDEEEE
console.log(removeLongest('AAAAaaCCCCCCcDDDEEEEEE')); // AAAAaacDDD
0
Ori Drori 19 nov. 2018 à 18:13

Une autre option est juste une boucle while à l'ancienne. Cela aura beaucoup plus de performances que l'utilisation d'une expression régulière au détriment de plus de code et (un peu) moins de lisibilité:

let s = "AAAAaaCCCCCCCcDDDEEEE"

let start = 0, max = 0, current = 0, maxStart = 0
while(current <= s.length) {
  if (s[current] !== s[start]){   
    if (current - start > max){
      max = current - start 
      maxStart = start
    }
    start = current
  }
  current++
}

// the found string:
console.log(s.substring(maxStart, maxStart+max))

// delete
s = s.slice(0,maxStart) + s.slice(max + maxStart) 
console.log(s)
0
Mark Meyer 19 nov. 2018 à 18:08