問題は、与えられた文字列 s から辞書編集的に最大の文字列を生成することです。したがって、目的は、s から辞書編集的に最大の一意の (繰り返しのない) 部分文字列 s1 を見つけることです。あるサブシーケンス s1 が別のサブシーケンス s2 よりも大きいとは、s1 が s2 よりも文字数が多い場合、または s1 が辞書編集的に s2 よりも長さが等しい場合です。
I/O は次のとおりです。
入力は: ba bab
出力は次のとおりです。
2番目の入力は次のとおりです。_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2 番目の出力: tsocrpkijgdqnbafhmle
これは私が Java コード用に書いたものですが、私のコードは 2 番目のテスト ケースで失敗します。また、2 番目の出力が tsrqponmlkjihgfedcba ではない理由を理解するのに苦労しています。誰かが修正や Java コードの提案を提供できますか?
アルゴリズムは、可能なすべての一意の文字列を生成し、それらを並べ替えて、辞書編集的に最大のものを見つけるよりも効率的でなければならないと思います。
質問をより明確にするために、入力が babab の場合、可能な一意の組み合わせはすべて b、a、ba、ab になります。出力は ba になります。これは、ab よりも長く、辞書編集的に大きいためです。
注:これは宿題ではありません。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class mostBeautiful {
final static int MAX = 1000000;
static String[] permute;
static void permutation(String prefix, String str, int counter) {
int n = str.length();
//System.out.println("n is: "+ n);
if (n == 0) {
permute[counter] = prefix;
} else {
for (int i = 0; i < n; i++) {
//System.out.println("str is: "+ str);
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), counter++);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine();
char[] unique = new char[26];
int counter = 0;
String answer = "";
//System.out.println("s is: " + s);
int ascii = 0;
final int asciiAVal = 97;
final int asciiZVal = 122;
for (int i = 0; i < s.length(); i++) {
ascii = (int)s.charAt(i);
if (ascii < asciiAVal || ascii > asciiZVal) {
continue;
}
char ch = s.charAt(i);
unique[ch - 'a'] = ch;
}
String result = "";
for (int j = 25; j >= 0; j--) {
result += unique[j];
}
result = result.trim();
System.out.println(result);
int size = result.length() * (result.length() - 1);
permute = new String[size];
permutation("", result, counter);
for (int i = 1; i < size; i++) {
if (permute[i].compareTo(permute[i - 1]) > 0){
answer = permute[i];
} else {
answer = permute[i - 1];
}
}
System.out.println("answer is: " + answer);
}
}