一道c++小编程题,

题目:

编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词,程序应该找出满足以下条件的单词的输入位置:该单词的后面紧跟着再次出现自己本身,跟 踪重复次数量多的单词及其重复次数.输出重复次数的最大值,
例如.如果输入是:
how now now now brown cow cow

则输出表明now这个单词出现了三次

本人解法:

#include <iostream>
#include <string>
#include <cctype>
#include <vector>
using namespace std;
int main() {
string s;
	vector<string> vec;
	int maxRepeat = 0;
	while (cin >> s){
		if(ispunct(s[s.size()-1])) s = s.substr(0,s.size() - 1);  //去除最后的标点符号
		vec.push_back(s);
	}
	vector<string>::size_type i = 0;
	vector<int> vecInt(vec.size(),1);
	while (i != vec.size() - 1){
		int j = i;
		string str = vec[i];
		while(i != vec.size() - 1)
		{
			if(str == vec[++i]) vecInt[j] ++;
			else break;
		}
	}
	vector<int>::size_type k = 0;
	int max = vecInt[k];
	int flag = 0;
	while (k != vecInt.size() - 1){
		if(max < vecInt[++k]){
			max = vecInt[k];
			flag = k;
		}
	}
	cout << "The word of " <<  vec[flag] << " repeats: " << vecInt[flag] << " times." << endl;
	cout << endl;
	return 0;

}


自己的解法答案是对的 但从空间复杂度来说要复杂的多,所以在网上搜了下,寻找到另外一种解决办法,修改后的代码如下:

#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() { 
string nowWord,beforeWord,result;
	cin >> nowWord;
	if(ispunct(nowWord[nowWord.size() - 1]))nowWord = nowWord.substr(0,nowWord.size() - 1);
	result = beforeWord = nowWord;
	int count = 1,maxCount = 1;
	while(cin >> nowWord){
		if(ispunct(nowWord[nowWord.size() - 1]))nowWord = nowWord.substr(0,nowWord.size() - 1);
		if (beforeWord == nowWord){
			count++;
		}
		else{
			beforeWord = nowWord;
			count = 1;
		}
		if(count > maxCount){
			maxCount = count;
			result = nowWord;
		}
	}
	if(maxCount == 1) cout << "There is no word repeating." << endl;
	else cout << "The word of " << result << " repeats: " << maxCount << " times." << endl;
	return 0;

}



特在此分享给大家 参考或给予好的想法参考改进。。谢谢~~
原文地址:https://www.cnblogs.com/james1207/p/3301725.html