杭电ACM 2072:单词数

来源:互联网 发布:手机投影仪连接软件 编辑:程序博客网 时间:2024/05/18 16:14

原创作品 转载请注明出处http://blog.csdn.net/always2015/article/details/45598799

这里写图片描述

这一道题如果用最直接的方法要考虑的地方会比较多,但是这样做肯定是会AC的。我就是用这种方法。在我的代码里面最后用到了map容器,不熟悉的请看我的博文http://blog.csdn.net/always2015/article/details/44980187。我的AC代码如下,各段代码的含义我已经注释很清楚了:

#include <iostream>#include<string>#include<map>using namespace std;int main(void){    //input_str存储整行字符串,words存储每个单词    string input_str,*words;    int lenght,flag=0,k=0,word_num=0;//word_num存储单词数    map<string,int> differ_word;//differ_word存储不同单词    while(getline(cin,input_str))    {        if(input_str=="#") break;//输入“#”就退出        lenght=input_str.size();        /*这个循环主要是求出单词数,        注意:输入的字符串可能开头,中间,结尾都有一个或者多个空格        这些都要考虑在内        */        for(int i=0; i<lenght; i++)        {            //flag为判断标志,当判断第一个字符不为空时候,且flag为0时候开始计数            if(input_str[i]!=' '&&flag==0)            {                ++word_num;                flag=1;//改变标志位的值,表示此时已经记过数了                continue;            }            if(flag==1)            {                //当flag==1说明已经即过数了。当碰到空的字符,说明这个单词已经扫描完成,重新置标志位flag                //因为当扫描到最后一个字符时候i==lenght-1,如果最后没有空格,也要重新置flag                if(input_str[i]==' '||i==lenght-1)                {                    flag=0;                }            }        }         //为保存单词分配空间        words=new string[word_num];        /*下面一个for循环只要是保存字符串中的单词*/        for(int j=0; j<lenght; j++)        {            //当碰到的字符不为空则存储单词,注意这时候k的变化            if(input_str[j]!=' ')            {                words[k]+=input_str[j];            }            //碰到空字符的判断            if(input_str[j]==' ')            {                //如果最后一个字符为空则跳出循环                if(j==lenght-1) break;                /*如果空字符的下一个字符不为空,则下一个单词就是新的一个单词,k就加1                注意:当一个字符串开始时,有一个或者很多个空格时候,则k不能加1.因为会导致words[k]存储的是空字符                所以这里要判断当words[k],不为空时候k才加1                */                if(input_str[j+1]!=' '&&words[k]!=" ")                ++k;            }        }       //利用容器map统计单词不一样的个数        for(int h=0;h<word_num;h++)        {            ++differ_word[words[h]];        }        //输出个数        cout<<differ_word.size()<<endl;        //下面变量必须重新初始化。方面下一次循环使用        word_num=0;        flag=0;        k=0;        differ_word.clear();//清空容器    }    return 0;}
0 0
原创粉丝点击