Carré Mot libre en Java


Je suis coincé sur la création d'un programme pour résoudre une question pour une classe. J'ai une méthode principale et une méthode de test secondaire qui fonctionnent conjointement pour résoudre ce problème, mais je ne peux pas faire fonctionner la solution en cas de changement. Le problème est de s'assurer qu'un mot est libre de carré, voici un extrait du problème:

Pour cette partie, implémentez une méthode appelée isSquareFree qui prend en entrée (une référence à ) un tableau de caractères. On peut supposer que que les éléments du tableau sont tous des lettres minuscules. (En d'autres termes, vous n'avez pas besoin de vous soucier d'une question comme: "Z est-il la même lettre que z?") Votre méthode doit tester si le tableau d'entrée donné de caractères est sans carré. Dans ce cas, la méthode doit imprimer un message indiquant que, sinon, il devrait afficher un message indiquant que le monde n'est pas carré-libre, où la place subword commence et ce qui subword est. Par exemple, si le tableau donné contenait le mot zatabracabrac le la méthode doit imprimer: Le mot, zatabracabrac, n'est pas libre de carré, car il a un sous-mot, abrac deux fois à partir de la position 4 du mot.

Voici le code actuel que j'ai, cela fonctionne dans le cas où il y a un caractère répétitif directement l'un à côté de l'autre, mais je ne sais pas comment continuer à vérifier s'il y a plusieurs caractères répétitifs (abab par exemple) et je ne sais pas comment imprimer le sous-mot répétitif.

public static void main(String[] args) {

    // part (a) of the main

    Scanner keyboard = new Scanner(System.in);

    System.out.println("***************************");
    System.out.println("        Part (a)");
    System.out.println("***************************");

    do{
        System.out.println("Enter a word and then press enter:");
        String str=keyboard.next();
        char[] word = str.toCharArray();

        isSquareFree(word);
        System.out.println("Do you want to test another word? Press y for yes, or another key for no");

    }while(keyboard.next().charAt(0)=='y');


}

public static void isSquareFree(char[] word){
    int sqf = 0;
    for(int i=0; i<word.length; i++){
        for(int j=0; j<word.length-1;j++){
            if (word[j] == word[j+1]){
                sqf = 1;
                j = word.length;
            }
            else{
                sqf = 2;
            }
        }
    }
    if (sqf == 1){
        System.out.println();
        System.out.println("Not Square Free");
    }
    else{
        System.out.println();
        System.out.println("Square Free");
    }
}}

Je voudrais également ajouter que je ne suis pas autorisé à utiliser la classe arrays pour cette question, je ne suis pas autorisé à utiliser des chaînes et je ne peux pas changer la méthode principale, je ne peux pas changer l'entrée pour mon autre méthode.

Author: user3731865, 2014-10-27

1 answers

  1. Pour voir si une séquence de caractères répète, pour une longueur de séquence (par exemple, n), vous devez remplacer votre if avec une boucle qui compare word[j+x] avec word[j+n+x], pour chaque valeur de x entre 0 et n; et ne les considère même si tous n match. Ainsi, vous devrez boucler ces n valeurs pour x; si vous devez considérer différentes valeurs de n , alors vous aurez besoin d'une autre boucle pour les parcourir.

    Il n'est pas clair dans votre code pour quoi vous utilisez i, mais si c'est la longueur de la partie répétitive (ce que j'ai appelé n), alors vous n'auriez besoin de considérer que des valeurs jusqu'à la moitié de la longueur de word (sinon il n'y a pas de place pour le répéter).

  2. Pour imprimer un sous-mot, vous pouvez imprimer chaque lettre individuelle dans l'ordre (en utilisant print au lieu de println)

 0
Author: Scott Hunter, 2020-06-20 09:12:55