杭电ACM 2072:单词数

原创作品 转载请注明出处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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值