Итак, я провел некоторое тестирование. В вашем подходе Test2 занимает много времени.
Данные: 2000 случайных строк из 20 символов.
Ваше решение: 2500 мс.
Сет Карнеги: 500 мс.
Хотя я считаю, что вы должны умножить их на 2, потому что s + v может быть палиндромом, а v + s - нет.
Идея: предположим, у нас есть слово
ABCD. Другими словами тогда могут быть палиндромы с этим: только cba и dcba. Давайте проверим, есть ли у нас те, кто присутствует.
...
#include <set>
using namespace std;
bool isPal(const string&);
int main() {
...
set<string> rWords;
...
while(fin){
fin >> str;
sWords.push_back(str);
if(!fin){
break;
}
reverse(str.begin(), str.end());//add reversed str to rWords
rWords.insert(str);
reverse(str.begin(), str.end());
...
}
...
// Test 2
for(int i = 0; i<sWords.size(); ++i)
for(int l = 0; l<sWords[i].length(); ++l)
if(isPal(sWords[i].substr(sWords[i].length()-l)))
{
string s = sWords[i].substr(0,sWords[i].length()-l);
set<string>::iterator it = rWords.find(sWords[i].substr(0,sWords[i].length()-l));
if(it != rWords.end())
{
string s = *it;
reverse(s.begin(), s.end());
if(s == sWords[i])//isPoly to itself
continue;
sTwoWords1.push_back(sWords[i]);
sTwoWords2.push_back(s);
}
}
...
return 0;
}
bool isPal(const string& testing) {
return std::equal(testing.begin(), testing.begin() + testing.size() / 2, testing.rbegin());
}
время: 15мс