1.问题描述 描述
在庆祝祖国母亲70华诞之际,老师给小乐乐出了一个问题。大家都知道China的英文缩写是CHN,那么给你一个字符串s,你需要做的是统计s中子串“CHN”的个数。
子串的定义:存在任意下标a < b < c,那么“s[a]s[b]s[c]”就构成s的一个子串。如“ABC”的子串有“A”、“B”、“C”、“AB”、“AC”、“BC”、“ABC”。
输入描述:输入只包含大写字母的字符串s。(1 ≤ length ≤ 8000)
输出描述:输出一个整数,为字符串s中字串“CHN”的数量。
题目链接小乐乐与字符串_牛客题霸_牛客网 (nowcoder.com)
2.问题求解我们拿到题目第一反应想到的就是三个for循环暴力求解
#includeint main() { char s[8000] = { 0 }; gets(s); int i = strlen(s); int a = 0; int b = 0; int c = 0; long long count = 0; for (a = 0; a < i - 2; a++) { if (s[a] == 'C') { for (b = a + 1; b < i - 1; b++) { if (s[b] == 'H') { for (c = b + 1; c < i; c++) { if (s[c] == 'N') count++; } } } } } printf("%ld", count); return 0; }
但是这里的字符串长度为8e3,于是我们暴力求解后便得到了它
我们为了算法简洁,我们想到这样一个办法,先遍历字符串,我们设定‘C’的数量为c,当我们遇到一个‘C’时,c++,当又遇到‘H’时我们以此时的下标向后进行一个for循环,碰到一个‘N’则有一个‘’CHN‘’字串。这样的方法就可以减少一次for循环,有效避免了超时的问题。
#includeint main() { char s[8000] = { 0 }; gets(s); int i = strlen(s); int a = 0; int b = 0; int c = 0; long long count = 0; for (a = 0; a < i; a++) { if (s[a] == 'C') b++; if (s[a] == 'H') { for (c = a + 1; c < i; c++) { if (s[c] == 'N') count += b; } } } printf("%ld", count); return 0; }
本文到此为止,感谢大家的阅读,欢迎大家点赞评论互关,祝大家万事如意。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)