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

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


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

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

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

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

转换规则

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

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

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

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

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

实现代码如下:

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

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>
 

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;

                   }
 

                   p++;

         }
 

         return nWordsNr;

}
 

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、付费专栏及课程。

余额充值