如何输出一个string中出现过不止一次的单词?例如输入“one one two”需要得到one?
空格分割,轮询对比
#include <iostream>
#include <string>
#include <vector>
#include<sstream>
using namespace std;
int main()
{
string temp = "one one two three four two one one one three";
vector<string> strSub; //用于存放分割后的字符串
vector<string> res; //存放重复的字符串
string result;
stringstream input(temp);
while (input >> result) //分割字符串
strSub.push_back(result);
string strRepetition = ""; //重复的字符串的下标
for (int i = 0; i < strSub.size(); ++i) //当前字符串依次与后面字符串对比
{
if (strRepetition.find(("," + to_string(i))) != -1) //判断是否是已对比后的下标
continue;
int j = i + 1;
int subNum = 0; //该字符串重复的个数
while (j < strSub.size())
{
if (strSub[i] == strSub[j])
{
subNum++;
strRepetition += ("," + to_string(j)); //存重复字符串的下标,下次循环直接跳过
}
j++;
if (j == strSub.size()) //对重复的字符串只保存一次
{
if (subNum > 0)
{
res.push_back(strSub[i]);
}
}
}
}
for (int i = 0; i<res.size(); i++){
cout << res[i] << endl;
}
system("pause");
return 0;
}
代码如下,如有帮助,请给个采纳,谢谢。
#include <iostream>
#include <map>
#include <string>
using namespace std;
//遇到" "即将字符串分割成小字符串
void DealStr(string pStr, char ch,map<string,int>& mapReturn)
{
string strtmp = "";
int nStartPos=0;
int nEndPos=0;
map<string,int>::iterator it;
while((nEndPos = pStr.find(ch,nStartPos))> 0)
{
strtmp = pStr.substr(nStartPos,nEndPos - nStartPos);
if(!strtmp.empty())
{
it = mapReturn.find(strtmp);
if (it == mapReturn.end())
{
mapReturn.insert(pair<string,int>(strtmp,1));
}else
{
int nmb = it->second + 1;
mapReturn.erase(it);
mapReturn.insert(pair<string,int>(strtmp,nmb));
}
}
nStartPos = nEndPos+1;
}
nEndPos=pStr.find('\0',0);
strtmp = pStr.substr(nStartPos,nEndPos-nStartPos);
if(!strtmp.empty())
{
it = mapReturn.find(strtmp);
if (it == mapReturn.end())
{
mapReturn.insert(pair<string,int>(strtmp,1));
}else
{
int nmb = it->second + 1;
mapReturn.erase(it);
mapReturn.insert(pair<string,int>(strtmp,nmb));
}
}
}
int main()
{
char buf[200] = {0};
cout <<"请输入一个字符串:";
cin.getline(buf,200);
map<string,int> vout;
DealStr(buf,' ',vout);
map<string,int>::iterator it = vout.begin();
for (; it != vout.end(); it++)
{
if(it->second > 1)
cout << it->first << endl;
}
return 0;
}