Java言語での回文判定

Java言語での回文判定

回文とは?

回文とは、前から読んでも後ろから読んでも同じ文字列になる言葉や文章を指します。例えば「かきくけこ」や「アナグラム」などが回文の例です。

回文を判定する方法は、文字列を一度逆さにして元の文字列と比較するという非常にシンプルなアプローチです。この判定をJavaでどのように実装するかについて詳しく解説します。

基本的な回文判定方法

回文判定の基本的な方法は、与えられた文字列が前後逆さにしても同じかどうかをチェックすることです。

例えば、文字列「madam」は逆さにしても「madam」と同じなので回文です。

コード例:

public class PalindromeCheck {
    public static void main(String[] args) {
        String str = "madam";
        if (isPalindrome(str)) {
            System.out.println(str + " は回文です。");
        } else {
            System.out.println(str + " は回文ではありません。");
        }
    }

    public static boolean isPalindrome(String str) {
        String reversed = new StringBuilder(str).reverse().toString();
        return str.equals(reversed);
    }
}

このコードでは、文字列を逆さにして、元の文字列と比較しています。

回文判定の例1

「level」という文字列が回文かどうかを判定します。

コード例:

public class PalindromeCheck {
    public static void main(String[] args) {
        String str = "level";
        if (isPalindrome(str)) {
            System.out.println(str + " は回文です。");
        } else {
            System.out.println(str + " は回文ではありません。");
        }
    }

    public static boolean isPalindrome(String str) {
        String reversed = new StringBuilder(str).reverse().toString();
        return str.equals(reversed);
    }
}

実行結果:

level は回文です。

回文判定の例2

次に、「hello」という文字列を回文かどうかを判定します。

コード例:

public class PalindromeCheck {
    public static void main(String[] args) {
        String str = "hello";
        if (isPalindrome(str)) {
            System.out.println(str + " は回文です。");
        } else {
            System.out.println(str + " は回文ではありません。");
        }
    }

    public static boolean isPalindrome(String str) {
        String reversed = new StringBuilder(str).reverse().toString();
        return str.equals(reversed);
    }
}

実行結果:

hello は回文ではありません。

効率的な回文判定の方法

基本的な方法では文字列を逆さにするため、全ての文字をメモリに一時的に格納します。しかし、文字列が長くなるとメモリを消費し、効率が悪くなります。

より効率的な方法は、文字列の両端から文字を1つずつ比較することです。この方法では、文字列を逆さにする必要がなく、メモリを節約できます。

コード例(効率的な方法):

public class PalindromeCheck {
    public static void main(String[] args) {
        String str = "madam";
        if (isPalindrome(str)) {
            System.out.println(str + " は回文です。");
        } else {
            System.out.println(str + " は回文ではありません。");
        }
    }

    public static boolean isPalindrome(String str) {
        int left = 0;
        int right = str.length() - 1;
        while (left < right) {
            if (str.charAt(left) != str.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

このコードは文字列の両端から比較を行い、早期に不一致が見つかれば処理を終了します。

応用的な回文判定方法

実際のアプリケーションでは、回文判定がさらに複雑になる場合もあります。例えば、大文字と小文字を区別せず、スペースや記号を無視して回文判定を行いたい場合です。

その場合、文字列を正規化(例えば、大文字に統一し、非英数字を削除する)する必要があります。

コード例(正規化後の回文判定):

public class PalindromeCheck {
    public static void main(String[] args) {
        String str = "A man, a plan, a canal, Panama";
        if (isPalindrome(str)) {
            System.out.println(str + " は回文です。");
        } else {
            System.out.println(str + " は回文ではありません。");
        }
    }

    public static boolean isPalindrome(String str) {
        // 正規化:大文字に統一し、非英数字を削除
        str = str.replaceAll("[^a-zA-Z]", "").toLowerCase();
        int left = 0;
        int right = str.length() - 1;
        while (left < right) {
            if (str.charAt(left) != str.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

このコードでは、入力文字列を正規化し、スペースや記号を削除した後に回文判定を行っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です