【Java】辞書順に並べ替え(B - Two Anagrams)
解いた問題
AtCoderの「B - Two Anagrams」
提出した回答
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); String t = sc.next(); sc.close(); //s_dash char[] s_stringToCharArray = s.toCharArray(); Arrays.sort(s_stringToCharArray); String s_dash = String.valueOf(s_stringToCharArray); //t_dash char[] t_stringToCharArray = t.toCharArray(); Arrays.sort(t_stringToCharArray); StringBuilder t_dash = new StringBuilder(); //降順に追加していく for (int i = t_stringToCharArray.length -1 ; 0 <= i; i--) { t_dash.append(t_stringToCharArray[i]); } //比較 if (s_dash.compareTo(String.valueOf(t_dash)) < 0) { System.out.println("Yes"); } else { System.out.println("No"); } } }
- sの各文字を辞書順に昇順に並び替えた文字列(最も辞書順が早いs)
- tの各文字を辞書順に降順に並び替えた文字列(最も辞書順が遅いt)
を比較する方針で書いた。
文字列の辞書順の比較はcompareToメソッドを使用した。
2つの文字列を辞書的に比較します。比較は文字列内のそれぞれの文字のUnicode値に基づいて行われます。この
String
オブジェクトによって表される文字シーケンスが、引数文字列によって表される文字シーケンスと辞書的に比較されます。このString
オブジェクトが辞書的に引数文字列より前にある場合は、結果は負の整数になります。このString
オブジェクトが辞書的に引数文字列の後ろにある場合、結果は正の整数になります。それらの文字列が等しい場合、結果はゼロになります。compareTo
から0
が返されるのは、equals(Object)
メソッドからtrue
が返される場合だけです。
戻り値: 引数文字列がこの文字列に等しい場合は、値 0
。この文字列が文字列引数より辞書式に小さい場合は、0
より小さい値。この文字列が文字列引数より辞書式に大きい場合は、0
より大きい値。
つまり、「文字列A」.compareTo(「文字列B」)とすると
- 戻り値 < 0 :文字列Aが文字列Bより辞書順で先
- 戻り値 = 0 :文字列Aと文字列Bが辞書順で等しい
- 戻り値 > 0 :文字列Aが文字列Bより辞書順で後
となる。
今回与えられる文字列は英小文字のみなのでcompareToで良いが、もし大文字も含まれるならcompareToIgnoreCaseを使用すると良さそう。
大文字と小文字の区別なしで、2つの文字列を辞書的に比較します。このメソッドは、文字列の正規化バージョンで
compareTo
を呼び出して得られた符号を持つ整数を返します。ここでは、各文字でCharacter.toLowerCase(Character.toUpperCase(character))
を呼び出すことで大文字と小文字の違いがなくなります。
TODO
- 他のA,B問題を解く
おわり。。