' P '

whatever I will forget

ABC 198 B - Palindrome with leading zeros (文字列操作系)

mankozooyork.hatenablog.com

問題文をしっかり読んでないミス

Nを十進法で表した文字列の先頭に0個以上の 0 をつけることで...
文字列の後ろにも"0"をつけるパターンとか考えてて解けず... となったが先頭だけでよかったのか... 乙すぎ....

StringBuilder完全に忘れてた

やっぱりしっかりと過去問しないとダメだなぁと思いました...
文字列系は唯一そこまで数学的じゃないので得意だったのに...

解き方

基本的に、回文系は文字列をひっくり消して比較するのがセオリーなはず
StringBuilderだとstr.reverse()があることを知らなかった...
普通にfor文回して作り直してたよ...

というわけで次回からは使おう!

で、解説みると、今回は文字列は109なので、10回ループ回して
1. 反転文字列をつくる
2. オリジナルと反転文字列を比較する
3. 文字列の先頭に"0"をつける
を繰り返せばよい。

賢い解き方

しかし、上記は計算量が多い場合どうしたらいいのか、という疑問があるので
問題を観察すると、要は文字列末尾の"0"を排除して反転文字と比較すればよいことがわかる!
例1: 12100 -> 121 : OK 例2: 00121 -> NG

Javaには実はendsWith()とかいうめっちゃ便利なメソッドがあるので、それで"0"を末尾に見つければ、切り取れば良いだけ!

package AtCoder.ABC198;
import java.util.Scanner;
public class MainB {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String n = sc.nextLine();
        sc.close();

        while(true) {
            if(n.endsWith("0")) n = n.substring(0, n.length()-1);
            else break;
        }

        StringBuilder tmp = new StringBuilder(n);
        String rev = tmp.reverse().toString();
        if(rev.equals(n)) {
            System.out.println("Yes");
            return;
        }
        System.out.println("No");
    }
}