0
votes

Diviser cette chaîne pour obtenir le nombre maximal à un caractère correspondant

Je suis en train de mettre en œuvre actuellement le codage de la longueur d'exécution pour la compression de texte et mon algorithme renvoie des chaînes de la forme suivante:

Disons que nous avons une chaîne comme entrée xxx

Ensuite, mon algorithme retourne xxx

maintenant, je veux appliquer Java String Split pour résoudre ceci, car je veux obtenir le nombre le plus élevé correspondant au caractère. Pour notre exemple, ce serait xxx

ma fonction peut être vu ci-dessous xxx


1 commentaires

J'ai une réponse mise à jour qui prend en charge les chiffres dans la ligne de chaîne a un look


4 Réponses :


1
votes

au lieu du tampon de chaîne, vous pouvez utiliser une carte, il sera beaucoup plus facile et propre à le faire.

A=5 B=4 C=8 A=3 B=3 D=2 5=2 6=2 7=2 C=4 z=1


5 commentaires

Vous pouvez accepter la réponse si vous pensez que cela vous donne une solution propre et meilleure.


Votre réponse échoue à AAAAABBBBCCCCCCCAAA . Il essaie de faire un algorithme de compression. Votre méthode donne 8a4b8c et serait étendu à AAAAAAAAABBBCCCCCCCC .


@Wjs j'ai fait les rectifications :) Merci, je n'ai pas remarqué sa logique de compression.


L'instruction d'impression mise à jour doit être ajoutée à deux endroits avec un ajustement de charat approprié. Résout le problème du chiffre que j'ai mentionné.


@WJS J'ai vu les mises à jour l'exemple AAAAAABBBBCCCCCCCAAAABBBDD556677CCCCCCCCCCCCCAAAABBBBDD556677CCCCCCCCCCCCCAAAAABBBBDDD5566777CCCCCCZ. Le résultat a été pris en charge à l'aide de l'instruction Imprimer que j'ai spécifié à remplacer.



1
votes
public static String getStrfinal(){

    StringBuilder sb = new StringBuilder();

    char last = 0;
    int count = 0;
    for(int i = 0; i < str.length(); i++) {

        if(i > 0 && last != str.charAt(i)) {
            sb.append(count + "" + last);
            last = 0;
            count = 1;
        }
        else {
            count++;
        }

        last = str.charAt(i);

    }
    sb.append(count + "" + last);
    return sb.toString();
}

0 commentaires

1
votes

Voici une solution possible. Il commence avec la chaîne brute et iTère simplement à travers la chaîne. XXX

mais un problème avec cette méthode et d'autres est ce qui se passe s'il y a des chiffres dans le texte? Par exemple. Et si la chaîne est aaabb999222aaa qui compresserait 3a2b39323a . Cela pourrait également signifier aaabb suivi de 39 3's et 23 a


1 commentaires

J'ai mis à jour ma réponse pour la même chose (y compris le nombre de nombres), j'ai un look si ça va



0
votes

C'est l'une des solutions possibles à votre question. Nous pouvons utiliser une structure de données LinkedHashMap qui est similaire à HASHMAP, mais elle maintient également la commande. Nous pouvons donc traverser la chaîne et stocker la survenue de chaque caractère en tant que paire de clés dans la carte et récupérer facilement avec son occurrence maximale.

public String getStrFinal(String str){
    if(str==null || str.length()==0) return str;
    LinkedHashMap<Character,Integer> map = new LinkedHashMap<>();
    StringBuilder sb=new StringBuilder(); // to store the final string
    for(char ch:str.toCharArray()){
        map.put(ch,map.getOrDefault(ch,0)+1);  // put the count for each character
    }
    for(Map.Entry<Character,Integer> entry:map.entrySet()){  // iterate the map again and append each character's occurence into stringbuilder
        sb.append(entry.getValue());
        sb.append(entry.getKey());
    }

    System.out.println("String = " + sb.toString()); // here you go, we got the final string
    return sb.toString();
}


0 commentaires