Мне дали задание создать класс, который с учетом строки создаст палиндром с минимальным количеством утверждений.
Пример выполнения:
Input: 123333
Output: 12333321
Input: 789
Output: 78987
Input: 1221
Output: 1221221
**Обратите внимание, что палиндром НЕ должен возвращать один и тот же палиндром.
Я попытался использовать модифицированный алгоритм KMP, как указано здесь а>.
Я возвращаю строку и сравниваю ее с обратной + исходной строкой, а затем добавляю несоответствия к исходной строке.
Однако моя функция работает только для входных данных с конечными цифрами (первый пример ввода), однако ввод типа 1234
вернет 1234123
, «92837465» вернет «928374659283746»
public static int[] computelps(String sample){
int[] lps = new int[sample.length()];
lps[0] = 0;
int i = 1;
int len = 0; // length of previous longest prefix suffix
while (i < sample.length()) {
if (sample.charAt(i) == sample.charAt(len)) {
len++;
lps[i] = len;
i++;
}
else
{
if (len != 0) {
len = lps[len - 1];
}
else {
lps[i] = 0;
i++;
}
}
}
return lps;
}
public static void Solution(File samplefile) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(samplefile));
String firstline = br.readLine();
String line;
while ((line = br.readLine()) != null) {
String reverse_str = "";
String newline = line.replace(".", "");
for (int i = newline.length() - 1; i >= 0; i--) {
reverse_str += newline.charAt(i);
}
int [] lps = computelps(reverse_str); // computes the lps of the pattern string
String tot = reverse_str + newline;
// KMP Algorithm modified.
int x = 0; // index for total_string(tot)
int y = 0; // index for pattern
String palindrome = newline;
while (x < tot.length()){
if(reverse_str.charAt(y) == tot.charAt(x)){
y++;
x++;
}
if(y == reverse_str.length()) {
y = lps[y - 1];
}
else if( x < tot.length() && (reverse_str.charAt(y) != tot.charAt(x))){
palindrome += tot.charAt(x);
if ( y!= 0){
y = lps[y-1];
}
else{
x += 1;
}
}
}
System.out.println(palindrome);
}
}
Буду признателен за любую помощь. Я нахожу алгоритмы очень сложными, поэтому, пожалуйста, потерпите меня, если мой подход или код не соответствуют требованиям.
* Я исправил примеры входных и выходных данных, а также добавил свои результаты.
1221
должен приводить к выводу12211221
? Разве это не должно быть1221221
, поскольку это минимальное количество сложений, необходимых для создания палиндрома? - person Jordan   schedule 11.09.2019