taiPyのお悩み解決ブログ

日々の発見をまとめます!

Javaの解答例:B - Substring, AtCoder Beginner Contest 347

はじめに

自分用の備忘録、これを後で振り返ってイメトレできるように!

自分の中のレパートリー、コードのお道具箱を増やしていくイメージ。

問題文と公式解説

atcoder.jp

atcoder.jp

解答例 自作

簡単解説

  1. 重複しない値を格納したいハッシュセットを用意
  2. Nもじずつの値を取り出す。for
  3. もし、i + jがSよりも長い、要するに取り出す位置が与えられた文字列Sの長さよりも長くなったら中のforを終えよう。(エラーになるから)
  4. 取り出した値を格納する

注意点(将来の自分に)

for (int j = 1; j <= SLength; j++) {ここ要注意。 substringのイメージを思い出そう!□□□□□□□□□が並んでいるイメージで。indexの区切りを入れるとすると、(ここから,index=0)0□1□2□3□4□5□6□7□8□9(ここまで, index=9)のイメージで。今回はi + jが最後の9まで行ってほしいから!

import java.util.HashSet;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String S = sc.nextLine();
        int SLength = S.length();
        HashSet<String> hashset = new HashSet<String>();

        for (int i = 0; i < SLength; i++) {
            for (int j = 1; j <= SLength; j++) {
                if (i + j > SLength) {
                    break;
                }
                String temp = S.substring(i, i + j);
                hashset.add(temp);
            }
        }

        System.out.println(hashset.size());

        
    }
}

解答例 公式C++をJavaへ

きれい。。

学び

なるほど、こういう風(i + j <= s.length();)にfor文の条件を指定できるのですね。for(int j = 1; i + j <= s.length(); j++) {

import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        HashSet<String> st = new HashSet<>();
        for(int i = 0; i < s.length(); i++) {
            for(int j = 1; i + j <= s.length(); j++) {
                st.add(s.substring(i, i + j));
            }
        }
        System.out.println(st.size());
    }
}

}