更好地实施“isPalindromic” [英] Better implementation of "isPalindromic"
问题描述
我已经尝试制作一个带字符串的函数,并告诉它是否是/或
这是Palindromic。我写的代码如下。我尝试使用
找到优化代码性能的方法。有什么建议吗?
#include< string>
#include< iostream>
#include< algorithm>
#include< ctype.h>
使用std :: string;
使用std :: cout;
使用std: :反向;
void toLower(const string& str,string& dest)
{
string :: const_iterator i;
for(i = str.begin(); i!= str.end(); ++ i)
dest + = tolower(* i);
}
void removePunctuation(const string& str,string& dest)
{
string :: const_iterator i;
for(i = str.begin(); i!= str.end(); ++ i)
if(isalpha(* i))dest + = * i;
}
bool isPalindrome(string& str)
{
string reversed = str;
反向(reversed.begin(),reversed.end());
返回str ==反转;
}
bool isPalindromic(const string& phrase)
{
string dest0,dest1;
toLower(phr ase,dest0);
removePunctuation(dest0,dest1);
返回isPalindrome(dest1);
}
int main(int argc,char * argv [])
{
cout<< isPalindromic(" anna");
返回0;
}
I''ve tried to make a function that takes a string and tells whether
this is Palindromic or not. The code I''ve written is below. I try to
find ways to optimize the performance of my code. Any suggestions?
#include <string>
#include <iostream>
#include <algorithm>
#include <ctype.h>
using std::string;
using std::cout;
using std::reverse;
void toLower (const string& str,string& dest)
{
string::const_iterator i;
for(i=str.begin();i!=str.end();++i)
dest+=tolower(*i);
}
void removePunctuation (const string& str,string& dest)
{
string::const_iterator i;
for(i=str.begin();i!=str.end();++i)
if(isalpha(*i)) dest+=*i;
}
bool isPalindrome (string& str)
{
string reversed=str;
reverse(reversed.begin(),reversed.end());
return str==reversed;
}
bool isPalindromic (const string& phrase)
{
string dest0,dest1;
toLower(phrase,dest0);
removePunctuation(dest0,dest1);
return isPalindrome(dest1);
}
int main(int argc, char* argv[])
{
cout<<isPalindromic("anna");
return 0;
}
推荐答案
le ********** @ gmail.com 写道:
我试图制作一个功能取一个字符串并告诉它是否是Palindromic。我写的代码如下。我试图找到优化代码性能的方法。有什么建议吗?
#include< string>
#include< iostream>
#include< algorithm>
#include< ctype.h>
使用std :: string;
使用std :: cout;
使用std :: reverse;
void toLower(const string& str,string& dest)
{
string :: const_iterator i;
for(i = str.begin(); i!= str.end(); ++ i)
dest + = tolower(* i);
}
void removePunctuation(const string& str,string& dest)
{
string :: const_iterator i;
for(i = str.begin(); i!= str。 end(); ++ i)
if(isalpha(* i))dest + = * i;
}
bool isPalindrome(string& str)
{
return str = string(str.rbegin(),str.rend()); string reversed = str;
reverse(reversed.begin(),reversed.end());
返回str == reverse;
}
bool isPalindromic( const string& phrase)
{
字符串dest0,dest1;
toLower(短语,dest0);
removePunctuation(dest0,dest1);
返回isPalindrome(dest1) ;
}
int main(int argc,char * argv [])
{
cout<< isPalindromic(" anna");
返回0;
}
I''ve tried to make a function that takes a string and tells whether
this is Palindromic or not. The code I''ve written is below. I try to
find ways to optimize the performance of my code. Any suggestions?
#include <string>
#include <iostream>
#include <algorithm>
#include <ctype.h>
using std::string;
using std::cout;
using std::reverse;
void toLower (const string& str,string& dest)
{
string::const_iterator i;
for(i=str.begin();i!=str.end();++i)
dest+=tolower(*i);
}
void removePunctuation (const string& str,string& dest)
{
string::const_iterator i;
for(i=str.begin();i!=str.end();++i)
if(isalpha(*i)) dest+=*i;
}
bool isPalindrome (string& str)
{ return str = string(str.rbegin(),str.rend()); string reversed=str;
reverse(reversed.begin(),reversed.end());
return str==reversed;
}
bool isPalindromic (const string& phrase)
{
string dest0,dest1;
toLower(phrase,dest0);
removePunctuation(dest0,dest1);
return isPalindrome(dest1);
}
int main(int argc, char* argv[])
{
cout<<isPalindromic("anna");
return 0;
}
return equal(str.begin(),str.end(),str.rbegin());
return equal(str.begin(), str.end(), str.rbegin());
< le ********** @ gmail.com>在消息中写道
news:11 ********************* @ y41g2000cwy.googlegro ups.com ...
<le**********@gmail.com> wrote in message
news:11*********************@y41g2000cwy.googlegro ups.com...
我试图创建一个带字符串的函数,并告诉它是否是Palindromic。我写的代码如下。我试图找到优化代码性能的方法。有什么建议吗?
#include< string>
#include< iostream>
#include< algorithm>
#include< ctype.h>
使用std :: string;
使用std :: cout;
使用std :: reverse;
void toLower(const string& str,string& dest)
{
string :: const_iterator i;
for(i = str.begin(); i!= str.end(); ++ i)
dest + = tolower(* i);
}
void removePunctuation(const string& str,string& dest)
{
string :: const_iterator i;
for(i = str.begin(); i!= str。 end(); ++ i)
if(isalpha(* i))dest + = * i;
}
bool isPalindrome(string& str)
{
string reversed = str;
reverse(reversed.begin(),reversed.end());
返回str == reverse;
}
bool isPalindromic( const string& phrase)
{
字符串dest0,dest1;
toLower(短语,dest0);
removePunctuation(dest0,dest1);
返回isPalindrome(dest1) ;
}
int main(int argc,char * argv [])
{
c out<< isPalindromic(" anna");
返回0;
}
I''ve tried to make a function that takes a string and tells whether
this is Palindromic or not. The code I''ve written is below. I try to
find ways to optimize the performance of my code. Any suggestions?
#include <string>
#include <iostream>
#include <algorithm>
#include <ctype.h>
using std::string;
using std::cout;
using std::reverse;
void toLower (const string& str,string& dest)
{
string::const_iterator i;
for(i=str.begin();i!=str.end();++i)
dest+=tolower(*i);
}
void removePunctuation (const string& str,string& dest)
{
string::const_iterator i;
for(i=str.begin();i!=str.end();++i)
if(isalpha(*i)) dest+=*i;
}
bool isPalindrome (string& str)
{
string reversed=str;
reverse(reversed.begin(),reversed.end());
return str==reversed;
}
bool isPalindromic (const string& phrase)
{
string dest0,dest1;
toLower(phrase,dest0);
removePunctuation(dest0,dest1);
return isPalindrome(dest1);
}
int main(int argc, char* argv[])
{
cout<<isPalindromic("anna");
return 0;
}
isPalindrome的当前实现做了太多工作,因为你好像b $ b似乎聚集了。你不需要制作字符串的反转副本,
或做(最多)str.length()比较。你可以逃脱(最多)
str.length()/ 2比较,没有额外的空间:
bool isPalindrome(const std :: string& ; s)
{
for(int i = 0,len = s.length(); i< len / 2; ++ i)
{
如果(s [i]!= s [len-1-i])返回false;
}
返回真的;
}
希望这会有所帮助:)
Stu
The current implementation of isPalindrome is doing too much work, as you
seem to have gathered. You don''t need to make a reversed copy of the string,
or do (at most) str.length() comparisons. You can get away with (at most)
str.length() / 2 comparisons and no additional space:
bool isPalindrome(const std::string& s)
{
for(int i=0, len=s.length(); i<len/2; ++i)
{
if(s[i] != s[len-1-i]) return false;
}
return true;
}
Hope this helps :)
Stu
这篇关于更好地实施“isPalindromic”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!