とりあえず全探索に弱い。
何も考えずにできるものであってもできないかもしれない。というわけでまとめあげ。
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の検索位置を0から始めるとして、 だけ検索すればよいだけです。
例えば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()); } }