更好地实施“isPalindromic” [英] Better implementation of "isPalindromic"

查看:88
本文介绍了更好地实施“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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆