题目:
编写一个小程序,从标准输入读入一系列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; }
特在此分享给大家 参考或给予好的想法参考改进。。谢谢~~