文字列がJavaの回文であるかどうかを確認します

1.はじめに

この記事では、Javaを使用して、特定の文字列が回文であるかどうかを確認する方法を説明します。

回文とは、単語、フレーズ、数字、または「マダム」や「レースカー」など、前方と同じ後方を読み取る文字のシーケンスです

2.ソリューション

次のセクションでは、特定の文字列が回文であるかどうかを確認するさまざまな方法を見ていきます。

2.1。簡単なアプローチ

指定された文字列を一度に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。文字列を逆にする

このユースケースに合わせて、いくつかの異なる実装があります:私たちは、からAPIメソッドを使用することができますのStringBuilderStringBufferの回文をチェックするときのクラスを、または私達は逆にすることができます文字列をこれらのクラスなし。

最初にヘルパー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); }

上記のスニペットでは、指定された文字列を最後の文字から繰り返し、各文字を次の文字に追加し、最初の文字まで追加して、指定された文字列を逆にします。

最後に、指定された文字列と反転された文字列が等しいかどうかをテストします。

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()メソッドを呼び出して、指定された文字列を逆にし、等しいかどうかをテストします。

2.3。使用してストリームAPIを

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)); }

上記のスニペットでは、我々はそれぞれの端から文字のペアのいずれことを確認文字列を満たしていない述語の条件を。

2.4。再帰の使用

再帰は、この種の問題を解決するための非常に一般的な方法です。示されている例では、指定された文字列を再帰的に繰り返し、テストして、それが回文であるかどうかを確認します。

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.結論

このクイックチュートリアルでは、特定の文字列が回文であるかどうかを確認する方法を説明しました。

いつものように、この記事のコード例はGitHubで入手できます。