Ниже приведена постановка задачи и ее решение. Два тестовых примера провалились для меня. Помогите мне разобраться.
Строка называется палиндромной, если она одинаково читается с обоих концов. Учитывая строку S
, вам разрешено выполнять циклические сдвиги. Более формально, вы можете выбрать любой символ с любого конца (голова или хвост) и добавить этот символ на другом конце. Например, если строка "abc"
, то если мы сделаем сдвиг, используя символ в позиции головы, тогда строка станет "bca"
. Точно так же, если мы делаем сдвиг, используя символ в хвосте, тогда входная строка становится "cab"
. Ваша задача — найти минимальное количество сдвигов, необходимых для того, чтобы данная строка стала палиндромом. В случае, если мы не можем преобразовать строку в палиндром, напечатайте -1
.
Формат ввода: первая строка начинается с T
, т.е. количества тестовых случаев, а затем следуют T
строк, каждая из которых содержит строку S
.
Формат вывода: Выведите минимальное количество циклических сдвигов для каждой строки, если ее можно сделать палиндромом, иначе -1
.
Ограничения: 1<=T<=100
, 1<=|S|<=300
, S
будут содержать только строчные буквы ('a'-'z')
.
Пример ввода и вывода
Вход
4
abbb
aaabb
aabb
abc
Выход
-1
1
1
-1
Объяснение: Для контрольного примера 2 (aaabb
): сдвиньте символ с хвоста на голову, и результатом будет «баааб», то есть палиндром. Это операция, которая требует минимального количества сдвигов, чтобы данная строка стала палиндромом.
Для контрольного примера 3 (aabb
): один из способов преобразовать заданную строку в палиндром — сдвинуть символ в начале к хвосту, и результатом будет "abba"
, то есть палиндром. Другой способ — сдвинуть символ с хвоста на голову, и в результате получится "baab"
, что тоже является палиндромом. Оба требуют только одну смену.
public class cyclic {
static boolean flag = false;
// fn to check if string is palindrome
static boolean ispal(String s) {
String reverse = "";
int length = s.length();
for (int i = length - 1; i >= 0; i--)
reverse = reverse + s.charAt(i);
reverse = reverse.trim();
if (s.equals(reverse)) {
flag = true;
return true;
} else {
return false;
}
}
// fn to perform front shift
static int frontshift(String str) {
int count = 0;
String element = "";
String s1[] = str.split("");
Deque<String> dequeA = new LinkedList<String>();
for (int i = 1; i < s1.length; i++) {
dequeA.add(s1[i]);
}
while (!ispal(str)) {
if (count <= str.length()) {
element = "";
String firstElement = dequeA.removeFirst();
dequeA.addLast(firstElement);
for (String object : dequeA) {
element = element + object;
}
str = element;
count++;
} else {
break;
}
}
return count;
}
// fn to perform backshift
static int backshift(String str) {
int count = 0;
String element = "";
String s1[] = str.split("");
Deque<String> dequeA = new LinkedList<String>();
for (int i = 1; i < s1.length; i++) {
dequeA.add(s1[i]);
}
while (!ispal(str)) {
if (count <= str.length()) {
element = "";
String firstElement = dequeA.removeLast();
dequeA.addFirst(firstElement);
for (String object : dequeA) {
element = element + object;
}
str = element;
count++;
} else {
break;
}
}
return count;
}
public static void main(String args[]) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
List<Integer> list = new ArrayList<Integer>();
int range = Integer.parseInt(br.readLine());
for (int i = 0; i < range; i++) {
String s = br.readLine();
int l1 = frontshift(s);
int l2 = backshift(s);
if (flag == true) {
if (l1 <= l2) {
list.add(l1);
} else {
list.add(l2);
}
} else {
list.add(-1);
}
flag = false;
}
for (Integer integer : list) {
System.out.println(integer);
}
}
}
br.readLine()
? Это вход в вашу программу. - person Peter Lawrey   schedule 21.08.2015String
, если вы можете проверить это сами, просто сравнив символы? Кроме того, если вы строитеString
шаг за шагом, используйтеStringBuilder
. - person fabian   schedule 21.08.20151
из ввода: кажется, это не нужно. Пожалуйста, проверьте мое редактирование и восстановите его, если я ошибаюсь. - person Tagir Valeev   schedule 21.08.20151
не понадобилось. Спасибо друг ! - person J.Selva   schedule 21.08.20151100
какой результат вы получаете? - person Peter Lawrey   schedule 21.08.20151
- это результат, так как его можно сделать палиндромом (0110
) с одним сдвигом назад. Я отредактировал вопрос после ваших вопросов. сейчас недостаточно ясно? - person J.Selva   schedule 21.08.2015