题目的要求是:一个字符串由多个单词组成,这些单词由一个或者连连续多个空格分隔开,请写一个程序统计输入的字符串
有多少个单词。
说明一下,此题解决方法不唯一,也有比我用的方法更简单。在这里,只是想针对有穷状态机算法来解决,顺便了解一
下该算法。
实现原理:
字母表:英文字母和空格。
状态:起始状态、单词状态、空格状态和接受状态。
转换规则:
起始状态下读到非空格,进入单词状态。
单词状态下读到空格,进入空格状态。
空格状态下读到非空格,进入单词状态。
在起始状态、单词状态和空格状态下读到’/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));
- }
- }