文字列を辞書順で比較
結論
単純に不等号(<
)で比較すると、文字列を辞書順で比較した結果を返す。
経緯
AtCoderを覗いていたら下記のような問題で少し考えた
問題文
英小文字のみからなる文字列s, tが与えられます。 あなたは、sの文字を好きな順に並べ替え、文字列 s′を作ります。 また、tの文字を好きな順に並べ替え、文字列 t′を作ります。 このとき、辞書順で s′<t′となるようにできるか判定してください。
引用: AtCoder - B - Two Anagrams
文字列sとtを並び替えて、辞書順でs'<t'
であるか否かを判別する問題
考えなければならないこと
どのように文字列を並び替えるか
求められているのはs'<t'
になることがあるか。(言い換えれば、することが出来るか否か)
つまり、s'
はなるべく小さな文字列に、t'
はなるべく大きな文字列にする必要がある。文字列の辞書順の比較を行う
なるべく小さくしたs'
となるべく大きくしたt'
の文字列を
辞書順で比較してs′<t′
となるか判定する必要がある。
1. どのように文字列を並び替えるか
文字列をなるべく小さくするためには、文字列を昇順に比較する。
(逆になるべく大きくするには降順に比較する)
const s = "ratcode"; const t = "atlas"; let ss = s.split('').sort((a, b) => a < b ? -1 : 1).toString(); // 昇順にソート "a,c,d,e,o,r,t" let tt = t.split('').sort((a, b) => a < b ? -1 : 1).reverse().toString(); // 降順にソート "t,s,l,a,a"
2. 文字列の辞書順の比較を行う
ここで表題の文字列の辞書順比較だが、これは単純に<
で比較を行うだけでよい。
if (ss < tt) console.log('true'); // 辞書順でss < ttのため、`true`が出力される。
sをなるべく小さな文字列(昇順ソート)、tをなるべく大きな文字列(降順ソート)すること、
文字列を辞書順で比較するときは<
を使うこと、の2点に気づけば簡単にとける問題だったが結構悩んだ。
まだまだ頭が固い。。