アナグラムは、別の単語の文字を再シャッフルまたは並べ替えることによって形成される単語です。アナグラムで重要な点は、文字は 1 回だけ使用でき、新しい単語で繰り返してはいけないということです。アナグラムとは、同じ文字数からなる単語のことです。ここでのカウントは非常に重要です。 Java のアナグラム プログラムは、2 つの文字列を並べ替えて比較することで、上記のような方法で使用できます。これらが成功した場合、その文字列はアナグラムであることを意味します。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
アルゴリズム:
特定の単語からアナグラムを取得するアルゴリズムを見てみましょう。アナグラムを調べる方法は 3 つあります。 3つの方法を1つずつ説明していきます。基本的なアルゴリズムは、文字列の長さをチェックすることで構成されます。長さが同じになったら、並べ替えたり数えたりして、アナグラムをチェックすることができます。
指定された文字列に対して最初にできることは、アナグラムであるかどうかを検証する両方の指定された文字列を並べ替えることです。並べ替えが完了すると、並べ替えられた順序で比較できます。このメソッドの時間計算量は O (n Logn) です。このための Java コードは次のように記述できます:
コード:
// JAVA program to validate if two strings are anagrams import java.io.*; import java.util.Arrays; import java.util.Collections; class Main { /* Below is a function which checks if the strings are anagram */ static boolean checkAnagram(char[] strana1, char[] strana2) { // Finding lengths of strings int len1 = strana1.length; int len2 = strana2.length; // If lengths do not match then they cannot be anagrams if (len1 != len2) return false; // Sort both strings Arrays.sort(strana1); Arrays.sort(strana2); // Comparing the strings which are sorted earlier for (int i = 0; i < len1; i++) if (strana1[i] != strana2[i]) return false; return true; } /* Main program to test Anagram*/ public static void main (String args[]) { char strana1[] = { 't', 'e', 's', 't' }; char strana2[] = { 't', 't', 'e', 'w' }; if (checkAnagram(strana1, strana2)) System.out.println("The strings to be checked are" + " anagram of each other"); else System.out.println("The strings to be checked are not" + " anagram of each other"); } }
上記のプログラムは、まず、指定された両方の文字列の長さをチェックします。文字列の長さが同じでない場合は false を返します。両方の文字列の長さが同じ場合にのみ、プログラムはさらに進みます。配列ソート関数を使用すると、2 つの配列内の文字列をソートします。配列ソート関数が両方の文字列で使用されると、文字列が比較され、各文字が for ループで比較されます。 for ループが成功し、両方の文字列のすべての文字が同じである場合、出力はアナグラムになります。 1 文字でも一致しない場合でも false を返します。ここのメイン プログラムは文字列をチェックし、checkAnagram 関数によって返された結果に応じて文字列がアナグラムであるかどうかを表示します。
出力:
入力を w の代わりに 't'、't'、'e'、's' に変更すると、出力は次のようになります。
出力:
この方法は、検証対象の文字列が小さい場合に使用できます。この方法では、保存される文字が 8 ビットであることを考慮し、おそらく 256 文字を保存できます。このメソッドでは、まずサイズ 256 の count 配列を使用して文字列をカウントし、count 配列内の必要なすべての値を 0 として初期化します。この配列をトラバースし、トラバース中にカウントをインクリメントします。これが完了すると、count 配列を比較できるようになります。カウントが同じ場合、返される結果は true になります。
コード:
import java.io.*; import java.util.*; class ANA { static int NO_CHARS = 256; /* Below is a function which checks if the strings are anagram */ static boolean isAnagram(char strana1[], char strana2[]) { // Here we create two arrays and initialize it to 0 int cnt1[] = new int[NO_CHARS]; Arrays.fill(cnt1, 0); int cnt2[] = new int[NO_CHARS]; Arrays.fill(cnt2, 0); int i; // For every character in input strings, increment the count for (i = 0; i < strana1.length && i < strana2.length; i++) { cnt1[strana1[i]]++; cnt2[strana2[i]]++; } // Checking If both strings are of different length if (strana1.length != strana2.length) return false; // Compare count arrays for (i = 0; i < NO_CHARS; i++) if (cnt1[i] != cnt2[i]) return false; return true; } /* Main program to test to check if string is Anagram or not*/ public static void main(String args[]) { char strana1[] = ("silent").toCharArray(); char strana2[] = ("lisent").toCharArray(); if (isAnagram(strana1, strana2)) System.out.println("The strings to be checked are" + " anagram of each other"); else System.out.println("The strings to be checked are not" + " anagram of each other"); } }
出力:
JavaのStringBuilder関数を利用してアナグラムを確認することができます。 deletechartAt() メソッドを使用して、2 番目の文字列に存在する文字を削除できます。
コード:
public class Main { static void findAnagram(String str1, String str2) { String copystr1 = str1.replaceAll( " ", "").toLowerCase(); String copystr2 = str2.replaceAll(" ", "").toLowerCase(); //Setting the initial status to true boolean flag = true; if(copystr1.length() != copystr2.length()) { //If copystr1 and copystr2 do not have same length then set the flag to false flag = false; } else { //changing copystr1 to char array char[] str1Array = copystr1.toCharArray(); //Creating StringBuilder from copystr2 StringBuilder sb = new StringBuilder(copystr2); //Validating if each character of str1Array is present in string builder for (char c : str1Array) { int index = sb.indexOf(""+c); if (index != -1) { sb = sb.deleteCharAt(index); } else { //If each character is not present, setting flag to false and breaking the loop flag = false; break; } } } if(flag) { System.out.println(str1+" and "+str2+" are anagrams"); } else { System.out.println(str1+" and "+str2+" are not anagrams"); } } public static void main(String[] args) { findAnagram("Silent", "Listen"); } }
ここでのプログラムはフラグを使用し、余分な文字の削除に役立つ文字列ビルダー モジュールを使用します。
出力:
以上がJava でのアナグラム プログラムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。