Étant donné la tâche mirrorEnds de CodingBat :
Étant donné une chaîne, recherchez une chaîne d'image miroir ( vers l' arrière ) au début et à la fin de la chaîne donnée.
En d'autres termes, zéro ou plusieurs caractères au tout début de la chaîne donnée et à la toute fin de la chaîne dans l'ordre inverse ( éventuellement en chevauchement ). Par exemple, la chaîne
"abXYZba"
a la fin miroir"ab"
.
Exemples:
mirrorEnds("abXYZba") → "ab"
mirrorEnds("abca") → "a"
mirrorEnds("aba") → "aba"
Ma solution pour cette tâche est la suivante :
public String mirrorEnds(String str) {
String result = "";
if (str.length() % 2 != 0) {
for (int i = 0; i < str.length() / 2; i++) {
if (str.charAt(i) == str.charAt(str.length() - i - 1)) {
result += "" + str.charAt(i);
} else {
break;
}
}
if (result.length() == str.length() / 2) {
String strEnd = new StringBuilder(result).reverse().toString();
result += "" + str.charAt(str.length() / 2) + strEnd;
}
}
if (str.length() % 2 == 0) {
for (int i = 0; i < str.length() / 2; i++) {
if (str.charAt(i) == str.charAt(str.length() - i - 1)) {
result += "" + str.charAt(i);
} else {
break;
}
}
if (result.length() == str.length() / 2) {
String strEnd = new StringBuilder(result).reverse().toString();
result += strEnd;
}
}
return result;
}
Est-il possible de résoudre ce problème en utilisant l' API Stream ?
Puisque vous demandez délibérément une solution de flux à ce problème, cela pourrait être de rechercher le plus grand index i
où les premiers i
caractères correspondent aux derniers i
caractères inversés, en i
commençant par length() / 2
et en procédant par décrémentation i
jusqu'à ce qu'il atteigne 0.
L'algorithme précédent n'a de sens que si la chaîne donnée n'est pas un palindrome. En fait, dans ce cas, la chaîne elle-même pourrait être renvoyée immédiatement.
public static String mirrorEnds(String str) {
if (str.equals(new StringBuilder(str).reverse().toString())) {
return str;
}
OptionalInt maxLen = IntStream.iterate(str.length() / 2, i -> i >= 0, i -> i - 1)
.filter(i -> str.substring(0, i).equals((new StringBuilder(str.substring(str.length() - i))).reverse().toString()))
.max();
return maxLen.isPresent() ? str.substring(0, maxLen.getAsInt()) : null;
}
ab
a
aba
Voici un lien pour tester le code :
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения