用有穷自动机解一道面试题

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>


当年从山东一家国企逃到北京时,第一次的面试题中有一道编程题,题目的要求是:一个字符串由多个单词组成,这些单词由一个或者连连续多个空格分隔开,请写一个程序统计输入的字符串有多少个单词。

<!--[if !supportEmptyParas]-->

这个题目很简单,可能有N种方法可以解决它。把它用来做实例,并非是要想说明DFA的功能强大,而是因为它是一个说明DFA的好例子。这个DFA

字母表:英文字母和空格。

状态:起始状态、单词状态、空格状态和接受状态。

转换规则

起始状态下读到非空格,进入单词状态。

单词状态下读到空格,进入空格状态。

空格状态下读到非空格,进入单词状态。

在起始状态、单词状态和空格状态下读到’/0’,进入结束状态。

每次进入单词状态,单词数计数加1

实现代码如下:

//Build: gcc -DDEBUG -g countwords.c -o cw.exe

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>


<!--[endif]-->

int CountWords(const char* pszStr)

{

enum

{

STAT_START,

STAT_IN_WORD,

STAT_IN_SPACE

}eState = STAT_START;

int nWordsNr = 0;

const char* p = pszStr;

assert(pszStr != NULL);


while(*p != '/0')

{

switch(eState)

{

case STAT_START:

{

if(*p == ' ')

{

eState = STAT_IN_SPACE;

}

else

{

nWordsNr++;

eState = STAT_IN_WORD;

}

break;

}

case STAT_IN_WORD:

{

if(*p == ' ')

{

eState = STAT_IN_SPACE;

}

break;

}

case STAT_IN_SPACE:

{

if(*p != ' ')

{

nWordsNr++;

eState = STAT_IN_WORD;

}

break;

}

default:break;

}


<!--[endif]-->

p++;

}


<!--[endif]-->

return nWordsNr;

}


<!--[endif]-->

int main(int argc, char* argv[])

{

int nRet = 0;

if(argc == 2)

{

nRet = CountWords(argv[1]);

printf("WordsNr=%d/n", nRet);

}

else

{

printf("Usage: %s [str]/n", argv[1]);

nRet = 0;

}

return nRet;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值