これはで達成できますO(strlen)
か?
はい。減少しないサブシーケンスは、次の3つの形式のいずれかになることに注意してください。
0........0 // Only zeros
1........1 // Only ones
0...01...1 // Some zeros followed by some ones
O(1)
最初の2つの形式は、すべて0を数え、すべて1を数えることで簡単にチェックインできます。
最後の1つは少し難しいです。これまでに見たゼロのカウンターと、これまでに0...01...1
発見した最も長いフォームの文字列の長さを維持しながら、文字列を調べる必要があります。文字列に表示される各ステップで1
、3番目の形式の最長のサブシーケンスの長さは、ゼロの数に1を加えたもの、または0...01...1
これまでに見た中で最も長いシーケンスに1を加えたものの大きい方になります。
Cでの上記のアプローチの実装は次のとおりです。
char *str = "10101001";
int longest0=0, longest1=0;
for (char *p = str ; *p ; p++) {
if (*p == '0') {
longest0++;
} else { // *p must be 1
longest1 = max(longest0, longest1)+1;
}
}
printf("%d\n", max(longest0, longest1));
max
次のように定義されます。
#define max( a, b ) ( ((a) > (b)) ? (a) : (b) )
これがideoneのデモへのリンクです。