我一直在用C ++写一个回文查找器,我已经成功地编写了一个......至少可以说是基本的。
我只是想增加程序的速度,现在需要大约1m 5s才能使用我拥有的功能在1500字的单词列表上运行palindromes / 2字回文测试。我想尝试在更大的文件上运行它,但却看不到我可以进一步优化的位置?
任何帮助将不胜感激:P.S。这不是为了学校,只是为了休闲。
#include <iostream>
#include <ostream>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
bool isPal(string);
int main() {
vector<string> sVec;
vector<string> sWords;
vector<string> sTwoWords1;
vector<string> sTwoWords2;
char myfile[256]="/home/Damien/Test.txt";
ifstream fin;
string str;
fin.open(myfile);
if(!fin){
cout << "fin failed";
return 0;
}
while(fin){
fin >> str;
sWords.push_back(str);
if(!fin){
break;
}
if(isPal(str)){
sVec.push_back(str);
}
else{
getline(fin, str);
}
}
reverse(sVec.begin(), sVec.end());
for(int i =0; i < sVec.size(); i++){
cout << sVec[i] << " is a Palindrome " <<endl;
}
// Test 2
for(int i=0; i<sWords.size(); i++){
for(int j=(i+1); j<sWords.size(); j++){
str = sWords[i]+sWords[j];
if(isPal(str)){
sTwoWords1.push_back(sWords[i]);
sTwoWords2.push_back(sWords[j]);
}
}
}
fin.close();
for(int i=0; i<sTwoWords1.size(); i++){
cout << sTwoWords1[i] << " and " << sTwoWords2[i] << " are palindromic. \n";
}
return 0;
}
bool isPal(string& testing) {
return std::equal(testing.begin(), testing.begin() + testing.size() / 2, testing.rbegin());
}
答案 0 :(得分:9)
你正在做很多不必要的工作来测试它是否是回文。只需使用std::equal
:
#include <algorithm>
bool isPal(const string& testing) {
return std::equal(testing.begin(), testing.begin() + testing.size() / 2, testing.rbegin());
}
这将从字符串的开头到字符串的中间,从字符串的末尾到中间进行迭代,然后比较字符。我不记得是谁给我这个,但我没想到。
编辑:我是在another question about palindromes中从Cubbi学到的。
答案 1 :(得分:3)
所以我做了一些测试。在你的方法中,Test2需要很长时间。
数据:2000随机20个字符串。
您的解决方案:2500毫秒。 Seth Carnegie:500毫秒。
虽然我相信你必须将它们乘以2,因为s + v可以是回文而v + s不是。
想法:假设我们有一个词 A B C D。其他话可以是palyndromes,这个只有 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毫秒