文字列がパリンドロームかどうかを確認する
1. 前書き
この記事では、特定のStringがJavaを使用して回文であるかどうかを確認する方法を説明します。
「madam」や「racecar」などのA palindrome is a word, phrase, number, or other sequences of characters which reads the same backward as forward。
2. ソリューション
次のセクションでは、特定のStringが回文であるかどうかを確認するさまざまな方法を見ていきます。
2.1. 簡単なアプローチ
指定されたstringを、一度に1文字ずつ前後に同時に反復し始めることができます。 一致する場合、ループが継続します。それ以外の場合、ループは終了します。
public boolean isPalindrome(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
int length = clean.length();
int forward = 0;
int backward = length - 1;
while (backward > forward) {
char forwardChar = clean.charAt(forward++);
char backwardChar = clean.charAt(backward--);
if (forwardChar != backwardChar)
return false;
}
return true;
}
2.2. 文字列を逆にする
このユースケースに適合するいくつかの異なる実装があります。パリンドロームをチェックするときにStringBuilderおよびStringBufferクラスのAPIメソッドを利用するか、これらなしでStringを逆にすることができます。クラス。
最初にヘルパーAPIを使用しないコード実装を見てみましょう。
public boolean isPalindromeReverseTheString(String text) {
StringBuilder reverse = new StringBuilder();
String clean = text.replaceAll("\\s+", "").toLowerCase();
char[] plain = clean.toCharArray();
for (int i = plain.length - 1; i >= 0; i--) {
reverse.append(plain[i]);
}
return (reverse.toString()).equals(clean);
}
上記のスニペットでは、指定されたStringを最後の文字から繰り返し、各文字を次の文字に追加し、最初の文字まで追加して、指定されたString.を逆にします。
最後に、指定されたStringと逆にされたString.の間の同等性をテストします
APIメソッドを使用しても同じ動作を実現できます。
簡単なデモンストレーションを見てみましょう。
public boolean isPalindromeUsingStringBuilder(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
StringBuilder plain = new StringBuilder(clean);
StringBuilder reverse = plain.reverse();
return (reverse.toString()).equals(clean);
}
public boolean isPalindromeUsingStringBuffer(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
StringBuffer plain = new StringBuffer(clean);
StringBuffer reverse = plain.reverse();
return (reverse.toString()).equals(clean);
}
コードスニペットでは、StringBuilderおよびStringBuffer APIからreverse()メソッドを呼び出して、指定されたStringを逆にし、等しいかどうかをテストします。
2.3. StreamAPIの使用
IntStreamを使用してソリューションを提供することもできます。
public boolean isPalindromeUsingIntStream(String text) {
String temp = text.replaceAll("\\s+", "").toLowerCase();
return IntStream.range(0, temp.length() / 2)
.noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1));
}
上記のスニペットでは、Stringの両端の文字のペアのいずれもPredicateの条件を満たすものではないことを確認しています。
2.4. 再帰の使用
再帰は、この種の問題を解決する非常に一般的な方法です。 示されている例では、指定されたStringを再帰的に繰り返し、テストして、それが回文であるかどうかを確認します。
public boolean isPalindromeRecursive(String text){
String clean = text.replaceAll("\\s+", "").toLowerCase();
return recursivePalindrome(clean,0,clean.length()-1);
}
private boolean recursivePalindrome(String text, int forward, int backward) {
if (forward == backward) {
return true;
}
if ((text.charAt(forward)) != (text.charAt(backward))) {
return false;
}
if (forward < backward + 1) {
return recursivePalindrome(text, forward + 1, backward - 1);
}
return true;
}
3. 結論
このクイックチュートリアルでは、特定のStringが回文であるかどうかを確認する方法を説明しました。
いつものように、この記事のコード例は利用可能なover on GitHubです。