たいちっち

競技プログラミングをしています

【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問題を解く

 

おわり。。