链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2072
题目要点:
1.求的是不同的单词数目,不是单纯的单词数目;
2.输入的字符串中,单词和单词之间可能有一个或者多个空格要注意筛掉这些空格,再计数。
这题我用了两种思路去ac。一种好理解,但代码麻烦,另一种代码很简单,但需要很多预备知识。
第一种,直接求:(参考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; }
另一种,利用了stringstream,它构造字符串流的时候,空格会成为字符串参数的内部分界,所以就可以以此来抓取string中的单词。
不懂的参考博文:http://www.usidcbbs.com/read-htm-tid-1898.html
然后《c++ primer plus》p789
奉上代码:
#include <iostream> #include<math.h> #include <iomanip> #include<cstdio> #include<string> #include<map> #include<vector> #include<list> #include<algorithm> #include<stdlib.h> #include<iterator> #include<sstream> using namespace std; int main() { string input; while(getline(cin,input)) { if(input[0]=='#') { break; } stringstream str(input);//利用字符串流初始化对象 string word; int word_num=0; map<string,int> diff_word;//利用map key-value的唯一性质 来找不同的单词 while(str>>word) { diff_word[word]++;//没次如果有重复的单词,那个单词的value会++而key值(也就是单词本身不会变化) } cout<<diff_word.size()<<endl; } return 0; }