入力文字列中のシーケンス 'abc'の出現回数を数えるためのCプログラムを書く。ただし、(aとb)または(bとc)の間には任意の文字を入れることができます。出力の文字列内のシーケンスの出現数を数えるには?
例:出力の
Enter a string: ann bmm cmm
Count is: 1
例:
Enter a string: ann bmm cmm ckc
Count is: 3
入力文字列中のシーケンス 'abc'の出現回数を数えるためのCプログラムを書く。ただし、(aとb)または(bとc)の間には任意の文字を入れることができます。出力の文字列内のシーケンスの出現数を数えるには?
例:出力の
Enter a string: ann bmm cmm
Count is: 1
例:
Enter a string: ann bmm cmm ckc
Count is: 3
a[k]
がインデックスi<=k
と'a'
の数に等しいとします。
c[k]
は、インデックスi>=k
を持つ'c'
の数に等しくなるようにしてください。
k: s[k] == 'b'
ごとに、a[k]*c[k]
のソリューションがあります。
これは、可能な実装(アルゴリズムを簡略化することができ、例えば、一つだけのアレイが必要とされている)である。
char* s = "pax byb zic abbc";
int n = strlen(s);
int a[n], c[n];
a[0] = (s[0] == 'a') ? 1 : 0;
for (int k = 1; k < n; ++k)
a[k] = a[k - 1] + ((s[k] == 'a') ? 1 : 0);
c[n - 1] = (s[n - 1] == 'c') ? 1 : 0;
for (int k = n - 2; k >= 0; --k)
c[k] = c[k + 1] + ((s[k] == 'c') ? 1 : 0);
int r = 0;
for (int k = 0; k < n; ++k)
if (s[k] == 'b')
r += a[k] * c[k];
printf("%d\n", r);
は、この問題は単に、再帰のために叫ぶません:
#include <stdio.h>
#include <string.h>
int occurrences(const char *pattern, const char *string) {
int sum = 0;
size_t p_length = strlen(pattern);
if (p_length > 0) {
size_t s_length = strlen(string);
for (int i = 0; i < s_length; i++) {
if (pattern[0] == string[i]) {
sum += (p_length == 1) ? 1 : occurrences(pattern + 1, string + i + 1);
}
}
}
return sum;
}
int main(int argc, char *argv[]) {
printf("%d\n", occurrences(argv[1], argv[2]));
return 0;
}
を
例
> ./a.out "abc" "ann bmm cmm"
1
> ./a.out "abc" "ann bmm cmm ckc"
3
> ./a.out "abc" "pax byb zic abbc"
8
>
'O(N)'の代わりに 'O(N^3)'という複雑さがあるようです。 (ただし、3文字のパターンに限定されるわけではありません。) – AlexD
@Jessブラウンどのようにあなたが目に3を手に入れましたeの2番目の例? –
入力が 'pax byb zic abbc'だった場合、出力はどうなりますか? 8? –
* "ただし、(aとb)または(bとc)の間には任意の文字を入れることができます。" (aとb)または(bとc)の間には* No *の文字があります。あなたが何を求めているのかは不明です。 * sequence *をどう定義していますか?それぞれの* 1 *が* 2 *未満であれば、答えは1です。そうであれば、2番目の例では「3」が加算されません。 –