特になんの工夫もせず。
#include <bits/stdc++.h>
using namespace std;
bool isACGT(char c){
return (c == 'A' || c == 'C' || c == 'G' || c == 'T');
}
int main()
{
string s;
cin >> s;
int len = s.length();
int i, j, maxlen = 0;
for (i = 0; i < len; i++, j=0){
while (isACGT(s[i+j])){ j++; }
maxlen = max(j, maxlen);
}
cout << maxlen << endl;
}
自分でかいたやつより、Naoki_M_ さんのが良いと思う。こんなの:
main = getLine >>= print . solve 0 0 solve ans _ [] = ans solve ans cnt (c:cs) = if c `elem` "ACGT" then solve (max ans (cnt + 1)) (cnt + 1) cs else solve ans 0 cs
自分で書いてみたやつ は、かなり、いまいちだなぁ。 max つけわすれて WA になったり。
また、hlint に言われたこと:
そうですね。
C++ 版と同じように書いたら、RE。あー、そうか。C++ だと文字列の終端 '\0' との比較で自然と while がとまっていたのが、 C# では範囲外アクセスで例外になるのかー。
using static System.Console;
using static System.Math;
class AtCoder
{
public static void Main()
{
var s = ReadLine();
int ans = 0;
int ct;
for (int i = 0; i < s.Length; i++){
ct = 0;
while (i+ct < s.Length && isACGT(s[i+ct])){ ct++; }
ans = Max(ans, ct);
}
WriteLine(ans);
}
static bool isACGT(char c) {
return (c == 'A' || c == 'C' || c == 'G' || c == 'T');
}
}
そういえば、C++ 版、return 0 してないけど、いいのかな、とか、C# の Main 関数の引数がどうあるべきなのか、とか、気にしてないや。 あとで調べよう。