2016-11-26 108 views
-1

編寫一個C程序來計算輸入字符串中序列'abc'的出現次數。但是,(a和b)或(b和c)之間可以有任何字母。輸出的如何統計字符串中序列的出現次數?

實施例:輸出

Enter a string: ann bmm cmm 
Count is: 1 

實施例:

Enter a string: ann bmm cmm ckc 
Count is: 3 
+1

@Jess布朗你怎麼在獲得第3第二個例子? –

+1

如果輸入是:'pax byb zic abbc',輸出應該是什麼? 8? –

+0

*「但是,(a和b)或(b和c)之間可以有任何字母。」* Huh? (a和b)或(b和c)之間可以有* No *字母。目前還不清楚你在問什麼。你如何定義*序列*?如果每一箇中至少有一個*,但少於兩個*,則答案是'1'?如果是這樣的話,你的第二個例子不會加上'3'? –

回答

1

a[k]等於的'a'具有索引i<=k數。
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); 
1

這難道不是問題,只是哭了遞歸:

#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 
> 
+0

它似乎有'O(N^3)'複雜性而不是可能'O(N)'。 (但另一方面,它不限於三字母圖案。) – AlexD

相關問題