Лексикографический ранг строки Java

Я пытаюсь написать программу, которая принимает «слово» от пользователя и выводит его лексикографический ранг среди всех его перестановок. У меня есть функции для получения ранга и вычисления факториалов (итеративно из соображений сложности), но мне нужен основной метод, чтобы протестировать программу и сделать ее работоспособной. Вот что у меня есть до сих пор:

EDIT: я пытаюсь преобразовать эту программу C, который правильно делает вышеперечисленное в Java. У меня возникли проблемы в основном с функциями увеличения и обновления счетчика, получающими ошибку:
The type of expression must be an array type but i resolved to int/String.

package ranking;

public class Ranking {

public static void increaseCount (int count, String str) {
    int i;
    for (i=0; str[i]; i++)
        count[str[i]]++;

    for (i=1; i < 256; i++)
        count[i] += count[i-1];
}

public static void updateCount (int count, String ch){
    int i;
    for (i=ch; i < 256; i++)
        count[i]--;
}

public static int findRank (String str) {
    int length = str.length();
    int mul = fact(length);
    int rank = 1, i;
    int count[256] = {0};

    increaseCount(count, str);

    for (i=0; i < length; i++) {
        mul/= length - i;

        rank += count [ str[i] - 1] * mul;

        updateCount(count, str[i];)
    }
    return rank;
}

public static int factorial (int n){
    int fact = 1;
    if (n ==0 || n==1) {
        return 1;
    }
    else {
        for (int i=1; i<=n; i++){
            fact *= i;
        }
    }
    return fact;
}

public static void main (String[] args){
    String str = "string";
    System.out.print(findRank(str));
}

}


person user3308568    schedule 07.08.2014    source источник
comment
Кроме того, вы уверены, что этот код правильно генерирует все перестановки входной строки? Я мог бы попытаться использовать что-то вроде алгоритма Стейнхауса-Джонсона-Троттера, реализованного здесь: stackoverflow.com/a/11916946/2514228   -  person Micah Smith    schedule 07.08.2014


Ответы (1)


Просто попробуйте какой-нибудь цикл:

public static void main(final String[] args) {
    final Scanner scan = new Scanner(System.in);
    System.out.println("Enter a string: ");
    String inputChars;
    while (!(inputChars = scan.next()).equals("exit")) {
        System.out.println(inputChars);
    }
    scan.close();
}

Протестировано. Работает.

person atmin    schedule 07.08.2014