文字列が回文かどうかを調べる

文字列がパリンドロームかどうかを確認する

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です。