• 状态机学习(一)统计字符


    题目来自<系统程序员成长计划>  

    作者:李先静.

    逐个字符扫描 根据是否为字母决定当前状态  由单词内状态切换到单词外 计数字符加1

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    string testString = " this's a test,'Hello World!!!' Welcome to the real world, it sucks, but you are gona love it!!!";
    
    enum STATE {
    	STAT_INIT,
    	STAT_IN_WORD,
    	STAT_OUT_WORD
    };
    
    size_t CountWords(const string& s)
    {
    	int count = 0;
    	STATE state = STAT_INIT;
    	for (size_t i = 0; i < s.size(); i++)
    	{
    		switch (state)
    		{
    		case STAT_INIT:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}else
    			{
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_IN_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				count++;
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_OUT_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				state = STAT_OUT_WORD;
    			}
    			break;
    		default:
    			break;
    		}//switch (state)
    	}
    	if (STAT_IN_WORD == state) {
    		count++;
    	}
    	
    	return count;
    }
    
    int main()
    {
    	cout << CountWords(testString) << endl;
    
    
           return 0;
    }
    

      改进版 计数以外还讲单词放入容器

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    string testString = " this's a test,'Hello World!!!' Welcome to the real world, it sucks, but you are gona love it!!!";
    
    enum STATE {
    	STAT_INIT,
    	STAT_IN_WORD,
    	STAT_OUT_WORD
    };
    
    size_t CountWords(const string& s)
    {
    	int count = 0;
    	STATE state = STAT_INIT;
    	for (size_t i = 0; i < s.size(); i++)
    	{
    		switch (state)
    		{
    		case STAT_INIT:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}else
    			{
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_IN_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				count++;
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_OUT_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				state = STAT_OUT_WORD;
    			}
    			break;
    		default:
    			break;
    		}//switch (state)
    	}
    	if (STAT_IN_WORD == state) {
    		count++;
    	}
    	
    	return count;
    }
    
    size_t word_segmentation(const string& s, vector<string>& strVec)
    {
    	STATE state = STAT_INIT;
    	size_t count = 0;
    	size_t subStrStart = string::npos;
    	size_t subStrEnd = string::npos;
    
    	for (size_t i = 0; i < s.size(); i++)
    	{
    		switch (state)
    		{
    		case STAT_INIT:
    			if (isalpha(s[i])) {
    				subStrStart = i;
    				state = STAT_IN_WORD;
    			}
    			break;
    		case STAT_IN_WORD:
    			if (!isalpha(s[i])){
    				count++;
    				subStrEnd = i;
    				strVec.push_back(s.substr(subStrStart, subStrEnd- subStrStart));
    				state = STAT_OUT_WORD;
    			}
    			break;
    
    		case STAT_OUT_WORD:
    			if (isalpha(s[i])) {
    				subStrStart = i;
    				state = STAT_IN_WORD;
    			}
    			break;
    		default:
    			break;
    		}//switch (state)
    	}
    	
    	if (state == STAT_IN_WORD) {
    		count++;
    		subStrEnd = s.size();
    		strVec.push_back(s.substr(subStrStart, subStrEnd- subStrStart));
    	}
    
    	return count;
    }
    
    
    int main()
    {
    	cout << CountWords(testString) << endl;
    
    	vector<string> strVec;
    	cout << word_segmentation(testString, strVec) << endl;
    
    	for (vector<string>::iterator it = strVec.begin();
    		it != strVec.end(); it++)
    	{
    		cout << *it << "  ";
    	}
    	cout << endl;
    
    
        return 0;
    }
    

      运行结果

    19
    19
    this s a test Hello World Welcome to the real world it sucks but y
    ou are gona love it
    请按任意键继续. . .

  • 相关阅读:
    mysql
    关于的字符串的总结(群,子群,KMP算法,正则表达式):
    正则表达式中[],,B的用法:
    链表
    numpy学习笔记
    算法的笔记 -概念性初始
    单线程实现了多任务异步协程
    windows安装redis出现的小问题
    将虚拟机的ip改为静态
    nosql与mysql的区别?
  • 原文地址:https://www.cnblogs.com/itdef/p/6097969.html
Copyright © 2020-2023  润新知