you are my friend #
4
我觉得这一道题比较关键的就是,如何提取单词,如何数究竟有多少个单词。
首先我们对于提取单词,有以下想法:
1、利用stringstream流来进行操作
2、利用pos1和pos2来定位一个单词的头字母对应下标和末字母对应的下标
3、流入stringstream后传给一个字符串,然后保留到另外一个字符串数组里(注意stringstream的清空操作!百度一下!)
4、关于数单词,我本来是打算,直接的在句子里面找的!利用find函数!
但是!这里有一个很大的问题!
do dog g
这里应该有3个单词对吧
我一开始的思路就是,找到了就erase(删除),直到找不到了,就sum++!
但是!我们这样子做输出就是2!
因为我们进行了第一次关于“do“的操作后,整个字符串就是g g,这个时候再操作!那就是2个了!
所以我改变了一种思维!那就是我们先储存我们的单词,再在后面在整个字符串数组里面进行一次遍历,这样子有方便!又不容易出错!!!good!!!
下面谈一下如何实现
对于提取单词,pos1(单词头字母怎么找
情况1 它是个小写字母,然后它的左边是空格
情况2 它是个小写字母,而且它的下标是0;
之所以有情况2,是因为一个普通的句子i love you,按照情况1你的下标就会-1,越界了!
对于pos2(单词的末字母怎么找
情况1 它是个小写字母,然后它的右边是个空格
情况2 它是个小写字母,而且它的下标刚好就是字符串.size()-1;
你发现了吗!我们都是对于边界有一些特殊的考虑!
具体的代码实现
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
int main()
{
stringstream ss;
string s;
while (getline(cin, s))
{
if (s == "#")
break;
else
{
string a[1000];
int k = 0;
for (int i = 0; i < 1000; i++)
a[i] = " ";
int pos1 = 0;
int pos2 = 0;
int pos3 = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= 'a'&&s[i] <= 'z'&&i == 0)
{
pos1 = i;
}
if (i >= 1 && s[i] >= 'a'&&s[i] <= 'z'&&s[i - 1] == ' ')
{
pos1 = i;
}
if (i == s.size() - 1 && s[i] >= 'a'&&s[i] <= 'z')
{
pos2 = i;
for (int i = pos1; i <= pos2; i++)
{
ss << s[i];
}
string tmp = ss.str();
ss.str("");
a[k] = tmp;
k++;
continue;
}
if (i < s.size() - 1 && s[i] >= 'a'&& s[i] <= 'z'&& s[i + 1] == ' ')
{
pos2 = i;
for (int i = pos1; i <= pos2; i++)
{
ss << s[i];
}
string tmp = ss.str();
ss.str("");
a[k] = tmp;
k++;
continue;
}
}
int sum = 0;
for (int i = 0; i < 1000; i++)
{
for (int j = i + 1; j < 1000; j++)
{
if (a[j] == a[i])
a[j] = " ";
}
}
for (int i = 0; i < 1000; i++)
{
if (a[i] != " ")
sum++;
}
cout << sum << endl;
}
}
}