本题没什么特别的算法,只是用到map映射来快速查找,虽然AC了但是时间和空间还是用去了很多,还是希望将来能够再优化下。Ps,之前没看到只要一个test case导致Time Limit exceeded.以后做题时要更加小心审题了…
#include <iostream>
#include <map>
#include <string>
using namespace std;
map<string, int> strMap;
map<string, int>::iterator it;
char s[50];
int main()
{
int n; // the size of phone number in this test case
int i;
bool isFound = false; // mark the flag
string tmpStr = "";
cin >> n; // only one test case
while (n--){
tmpStr.clear();
cin >> s;
for (i = 0; i < strlen(s); i++){ // sort the data
if (isdigit(s[i])){
tmpStr.push_back(s[i]);
}
else if (s[i] >= 'A'&&s[i] <= 'C'){
tmpStr.push_back('2');
}
else if (s[i] >= 'D'&&s[i] <= 'F'){
tmpStr.push_back('3');
}
else if (s[i] >= 'G'&&s[i] <= 'I'){
tmpStr.push_back('4');
}
else if (s[i] >= 'J'&&s[i] <= 'L'){
tmpStr.push_back('5');
}
else if (s[i] >= 'M'&&s[i] <= 'O'){
tmpStr.push_back('6');
}
else if (s[i] == 'P' || s[i] == 'R' || s[i] == 'S'){
tmpStr.push_back('7');
}
else if (s[i] >= 'T'&&s[i] <= 'V'){
tmpStr.push_back('8');
}
else if (s[i] == 'W' || s[i] == 'X' || s[i] == 'Y'){
tmpStr.push_back('9');
}
}
tmpStr.insert(3, 1, '-'); // offset, count, char
it = strMap.find(tmpStr);
if (it != strMap.end()){ //if find out
it->second++;
isFound = true;
}
else{
strMap[tmpStr] = 1; //otherwise,insert new data
}
}
for (it = strMap.begin(); it != strMap.end(); it++){
if (it->second > 1){
cout << it->first << " " << it->second << "\n";
}
}
if (!isFound){
cout << "No duplicates." << "\n";
}
return 0;
}