30 May, 2020

AtCoder(go) ABC122-B

B-ATCoder

【概要】 英大文字からなる文字列Sが与えられる。 S のなかで A、C、G、T(ACGT 文字列) で構成される最も長い部分文字列の長さを求める。

全探索で求める。

先頭の文字から探索し ACGT 文字列に合致した場合フラグを true にする。

ACGT 文字列に合致しない文字が現れた場合フラグを false にする。

今回は、4 文字との合致判定なので、if 文で or 条件を 4 つ並べたが、合致すべき文字数が多い場合は内部で対象の文字列を for 文で回した方が簡単にかけるはず。

また、go 言語で string 文字列を range で回す場合は、rune 型で取得する点に注意。

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {

	var flg bool
	var cnt int
	str := StrStdin()

	var result int

	for _, v := range str {
		if string(v) == "A" || string(v) == "C" || string(v) == "G" || string(v) == "T" {
			if !flg {
				flg = true
			}
            cnt++

            // カウントが過去最大だったらresultを上書きする。
			if result <= cnt {
				result = cnt
			}

		} else {
			flg = false
			cnt = 0
		}
	}

	fmt.Println(result)
}

func StrStdin() string {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	return strings.TrimSpace(scanner.Text())
}

Tags

: AtCoder, Go