这题并不难,相信各位都能做出来,但你们使用的算法可能会很复杂。前不久我在洛谷上做了一道相似的题:统计单词数。查看题解时,发现了一个大佬的超强算法——有穷自动机。
图灵机大概就是一个“自动机”,就是说代码分好几种状态,每种状态做不同的事。
单看这句话,我也看不懂,举个例子:
输入一个字符串,输入的只有两种字符,一种是字母,一种是空格。现在求一共有几个单词。注意,有可能有多个空格连在一起,开头和结尾都有可能有空格。
那么这是一道简单的有穷自动机,运行时分两种情况:
①是空格
②是字母
(其实当前状态就是上一个字符的状态
那么在遍历数组的时候拿一个变量记录下来当前是什么状态,可以用0代表当前是空格状态,1代表是字母状态
当如果当前状态是1,而现在却遇到空格,那么就计数器加一, 同时要将状态改为0, 如果当前状态是0,现在的字符却是字母,就只将状态改为1
还有一个容易漏掉的情况:如果在跳出循环的时候状态是1,说明最后一个字符是字母而不是空格,要将计数器加一,否则就会少统计一个单词。
然后就是代码:
注:不是本题的代码!!!是这个例子的代码!!!
#include <cstdio>
int main () {
char a[1001];
int state, ans = 0;
gets(a);
if(a[0] == ' ') state = 0;//设置初始值
else state = 1;
for(int i = 1; a[i]; i ++ ) {
//要从一开始遍历,因为零已经遍历过了
if(a[i] == ' ') {
//是空格
if(state