private static int replace(String cad) {
int originalLength = cad.length();
for (;;) {
String cad2 = cad.replace("RAV", "");
if (cad2.length() == cad.length()) {
break;
}
cad = cad2;
}
return (originalLength - cad.length()) / "RAV".length();
}
Прежде всего indexOf
следует поместить в переменную, как три раза.String.replace
может сделать несколько замен.Тогда сокращение выражения имеет другой порядок, но для «RAV» это не приведет к другому результату.
В приведенном выше примере вы можете проверить результат замены для cad2 == cad
, но некоторые контролеры стиля предпочтут равно.Достаточно равенство длины.
И, конечно, число замен - это уменьшение длины / 3.
Поскольку фактическое измерение показало String.replace(String, String)
медленным:
private static int replace(String cad) {
// Could try to shorten string: cad = cad.replaceAll("[^RAV]+", "e");
StringBuilder sb = new StringBuilder(cad);
int pos0 = 0;
for (;;) {
int pos = sb.indexOf("RAV", pos0);
if (pos == -1) {
break;
}
sb.delete(pos, pos + 3);
// Continue searching 2 chars before.
pos0 = Math.max(0, pos - 2); // RA[RAV]V
}
return (cad.length() - sb.length()) / 3;
}
Спасибо @GPI за сравнительный анализ.