由于项目提交测试,上班时间比较无聊,于是乎瞎逛论坛回答问题赚积分。无意间看到开源中国老大红薯发的贴,是关于
一道笔试题的。解题的思路是通过有穷状态机来解决,看了一下思路,自己也写了写java版本的。(原文是C++版本的)
题目的要求是:一个字符串由多个单词组成,这些单词由一个或者连连续多个空格分隔开,请写一个程序统计输入的字符串
有多少个单词。
说明一下,此题解决方法不唯一,也有比我用的方法更简单。在这里,只是想针对有穷状态机算法来解决,顺便了解一
下该算法。
实现原理:
字母表:英文字母和空格。
状态:起始状态、单词状态、空格状态和接受状态。
转换规则:
起始状态下读到非空格,进入单词状态。
单词状态下读到空格,进入空格状态。
空格状态下读到非空格,进入单词状态。
在起始状态、单词状态和空格状态下读到’/0’,进入结束状态。
每次进入单词状态,单词数计数加1。
package com.cetus.test;
public class DFA {
public enum State {
STAT_START, STAT_IN_WORD, STAT_IN_SPACE
};
public static int DFATest(String str) {
State state = State.STAT_START;
int numOfWords = 0;
for (int i = 0; i < str.length(); i++) {
char aChar = str.charAt(i);
if (aChar != '\0') {
switch (state) {
case STAT_START: {
if(aChar ==' '){
state=State.STAT_IN_SPACE;
}else{
numOfWords++;
state=State.STAT_IN_WORD;
}
break;
}
case STAT_IN_WORD: {
if(aChar ==' '){
state=State.STAT_IN_SPACE;
}
break;
}
case STAT_IN_SPACE: {
if(aChar !=' '){
state=State.STAT_IN_WORD;
numOfWords++;
}
break;
}
default:break;
}
}
}
return numOfWords;
}
public static void main(String[] args) {
String strWords="i am cetus, how are you?";
System.out.println(DFATest(strWords));
}
}