これは、 quickselect アルゴリズムに似ています。ソートされていない整数の配列で、特定の配列要素のインデックスを見つけます。パーティション要素は、指定された文字列になります。
編集:
実際には、QuickSort で行われるパーティション方法に似ています。指定された文字列はパーティション要素です。すべての順列が生成されると、長さ k の文字列のランクを見つける複雑さは O(nk) になります。再帰を使用して文字列順列を生成し、それらをリンク リストに格納できます。この連結リストを partition メソッドに渡すことができます。
すべての文字列順列を生成する Java コードは次のとおりです。
private static int generateStringPermutations(String name,int currIndex) {
int sum = 0;
for(int j=name.length()-1;j>=0;j--) {
for(int i=j-1;((i<j) && (i>currIndex));i--) {
String swappedString = swapCharsInString(name,i,j);
list.add(swappedString);
//System.out.println(swappedString);
sum++;
sum = sum + generateStringPermutations(swappedString,i);
}
}
return sum;
}
編集:
すべての順列を生成するにはコストがかかります。文字列に個別の文字が含まれている場合、すべての順列を生成しなくてもランクを決定できます。ここにリンクがあります。
これは、繰り返し文字がある場合に拡張できます。
x * (n-1) の代わりに! これは、リンクのように言及されている個別のケースのためのものです。
繰り返し文字の場合は次のようになります。
2回繰り返される文字が1つある場合、
x* (n-1)!/2!
例を見てみましょう。文字列 abca の組み合わせは次のとおりです。
aabc,aacb,abac,abca,acab,acba,baac,baca, bcaa ,caab, caba , cbaa (ソート順)
組み合わせの合計 = 4!/2! = 12
「bcaa」のランクを見つけたい場合、「a」で始まるすべての文字列が 3 より前にあることがわかります。= 6。
「a」が開始文字であるため、残りの文字は a、b、c であり、繰り返しがないため 3! であることに注意してください。また、「ba」で始まる文字列は 2 より前になることもわかっています。= 2 なのでランクは 9です。
もう一つの例。'caba'のランクを見つけたい場合:
a で始まるすべての文字列は = 6 より前です。b で始まるすべての文字列は = 3!/2! より前です。= 3 (一度 b を選択すると、a、a、c が残り、繰り返しがあるため、3!/2! になります。caa で始まるすべての文字列は、1 になる前になります。
したがって、最終的なランクは 11です。