Скорее всего, это наиболее эффективная реализация в Java:
public static boolean isP(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < (chars.length / 2); i++) {
if (chars[i] != chars[(chars.length - i - 1)])
return false;
}
return true;
}
Преимущества:
- Возвращается с первого взгляда на разницу.
- Использует прямой доступ к char [], чтобы избежать дополнительных проверок, выполняемых в charAt
- Итерирует только половину строки, в отличие от полной строки.
Это, как и все другие предложенные решения, все еще O (N).
Я только что измерил времена для представленных решений для действительно большой строки (времена в наносекундах):
Aran: 32244042
Andreas: 60787894
Paul Tomblin: 18387532
Во-первых, вышеупомянутые измерения были выполнены с клиентской виртуальной машиной . Таким образом, расчет i < (chars.length / 2)
не был встроен как константа. Использование параметра -server Vm дало намного лучший результат:
Aran: 18756295
Andreas: 15048560
Paul Tomblin: 17187100
Чтобы сделать его немного экстремальным:
Сначала предупреждающее слово: НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД В ЛЮБОЙ ПРОГРАММЕ, КОТОРОЙ ВЫ НАМЕРЕНЫ ИСПОЛЬЗОВАТЬ / ПЕРЕВОЗИТЬ.
Он содержит скрытые ошибки и не подчиняется Java API и не обрабатывает ошибки, как указано в комментариях. Он служит исключительно для демонстрации теоретических улучшений производительности, достигаемых грязными уловками.
Существуют некоторые издержки при копировании массива из строки, поскольку класс строки внутренне создает защитную копию.
Если мы получим исходный символ [] из строки напрямую, мы сможем выжать немного производительности за счет использования операций отражения и несохранения над строкой. Это дает нам еще 20% производительности.
public static boolean isPReflect(String s) {
char[] chars = null;
try {
final Field f = s.getClass().getDeclaredField("value");
f.setAccessible(true);
chars = (char[]) f.get(s);
}
catch (IllegalAccessException e) {
}
catch (NoSuchFieldException e) {
}
final int lenToMiddle = chars.length / 2;
for (int i = 0; i < lenToMiddle; i++) {
if (chars[i] != chars[(chars.length - i - 1)])
return false;
}
return true;
}
Times:
Aran: 18756295
Andreas1: 15048560
Andreas2: 12094554
Paul Tomblin: 17187100