' P '

whatever I will forget

全探索系

とりあえず全探索に弱い。
何も考えずにできるものであってもできないかもしれない。というわけでまとめあげ。

B - ATCoder

注記に書いてあることがよく理解できなかった...
単にACGTのどれかの文字列を発見したら、そのindexからどれだけの長さの文字列が最大でACGTを続けて含んでますか?という問題

解法1

ABCDEFGと文字列があれば[1,0,1,0,0,0,1]という配列作っちゃいましょう。そうしたらあとは1がどれだけ続くか確認すればよいだけです.

解法2

ACGTのString変数を作って全探索.(こっちのほうが普通だし処理時間を今回気にする問題ではない)

        int ans = 0;
        int[] acgt = new int[s.length];
        for(int i=0; i<s.length; i++) {
            if(s[i] == 'A' || s[i] == 'C' || s[i] == 'G' || s[i] == 'T') {
                acgt[i] = 1;
            }
        }
        int cnt = 0;
        for(int i=0; i<acgt.length; i++) {
            if(acgt[i] == 1) {
                cnt += 1;
            } else {
                cnt = 0;
            }
            ans = Math.max(cnt,ans);
        }
        System.out.println(ans);

B - Substring

久々にB問題解けなかった...ショックです、が確かにサボってたので精進します。
単純に  S > T が保証されているので、Sの検索位置を0から始めるとして、 (S - T) + 1 だけ検索すればよいだけです。
例えばS = abcde, T = abcなら

|0|1|2|3|4|
 a b c
   b c d
     c d e

が候補になります。

import java.util.Scanner;

public class Main6 {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String t = sc.nextLine();
        sc.close();

        int ans = 0;
        for(int i=0; i<=s.length()-t.length(); i++) {
            int match = 0;
            for(int j=0; j<t.length(); j++) {
                if(s.charAt(i+j) == t.charAt(j)) {
                    match++;
                }
            }
            ans = Math.max(ans,match);
        }
        if(ans != 0) System.out.println(t.length()-ans);
        else System.out.println(t.length());
    }
}