kmmkの雑種系日記

学習まとめです。

 ABC147 B - Palindrome-philia の振り返り

問題

高八士君は回文が大好きで、回文でない文字列が許せません。高八士君は文字列を 1 回ハグするごとに、文字列から 1 文字を選んで任意の文字に変えることができます。 文字列 S が与えられます。 S を回文にするために必要なハグの最小回数を答えてください。

自分

  • 解法
    • 文字列を中心で2分割して、後半の文字列をリバース(前:before, 後:afterと定義)
    • beforeとafter両方を0番目から確認して、同じインデックスで異なる文字が存在した場合、カウントアップする
    • カウントアップ数 = 置き換える最短回数
  • 課題
    • Javaの文法の理解不足
    • もう少し簡潔に書く
    1.   public static void main(String[] args) {
    2.       Scanner scanner = new Scanner(System.in);
    3.       String inputStr = scanner.nextLine();
    4.       int inputStrSize = inputStr.length();
    5.       
    6.       String before = "";
    7.       String after = "";
    8.       if (inputStrSize % 2 == 0) {
    9.               int splitPoint = inputStrSize / 2;
    10.         before = inputStr.substring(0, splitPoint);
    11.         after = inputStr.substring(splitPoint);
    12.                after = stringReverce(after);
    13.       } else {
    14.         int splitPoint = inputStrSize / 2;
    15.         before = inputStr.substring(0, splitPoint);
    16.         after = inputStr.substring(splitPoint + 1);
    17.                 after = stringReverce(after);
    18.       } 
    19.               System.out.println(judgeCount(before, after));
    20.     }
    21.   
    22.     public static String stringReverce(String str) {
    23.       StringBuffer sb = new StringBuffer(str);
    24.       return sb.reverse().toString();
    25.     }
    26.    
    27.     public static int judgeCount(String str1, String str2) {
    28.       int cnt = 0;
    29.       int size = str1.length();
    30.       for (int i = 0; i < size; i++) {
    31.                 if (!(str1.charAt(i) == str2.charAt(i))) {
    32.                 cnt++;
    33.         }
    34.       }
    35.       return cnt;
    36.     }
  • 解法
    • 文字列を文字の配列にする
    • 文字の長さの1/2回for分で回す
  • 感想
    • Javaでは文字列系の問題は文字の配列に直して対応した方が楽だと思った
    1.    public static void main(String[] args) {
    2.         Scanner sc = new Scanner(System.in);
    3.         char[] s = sc.next().toCharArray();
    4.         int n = s.length;
    5.         int c = 0;
    6.         for (int i = 0 ; i < n/2 ; i++) {
    7.             if (s[i] != s[n-1-i]) c++;
    8.         }
    9.  
    10.         System.out.println(c);
    11.     }