我想创建返回true / false的函数,如果输入是回文或者不是,当给出abcddcba或aba时它不给出true,但它应该。请帮忙
bool checkPalindrome(char input[],int p=0) {
if(input[1]=='\0'){
return true;
}
if(sizeof(input)%2==0) {
int a = sizeof(input);
for(int i=0;i<(a/2);i++) {
if(input[0+i]==input[a-i-2]){
p++;
}
}
if(p==a/2){
return true;
} else{
return false;
}
}
else{
int a = sizeof(input);
for(int i=0;i<((a-1)/2);i++)
{
if(input[0+i]==input[a-i-2]){
p++;
}
}
if(p==(a-1)/2){
return true;
} else{
return false;
}
}
}
答案 0 :(得分:3)
C ++风格:
bool checkPalindrome(const std::string& str)
{
size_t len = str.size();
for (size_t i = 0; i < len/2; i++)
{
if (str[i] != str[len-1-i])
return false;
}
return true;
}
C风格:
bool checkPalindrome(const char* str)
{
size_t len = str ? strlen(str) : 0;
for (size_t i = 0; i < len/2; i++)
{
if (str[i] != str[len-1-i])
return false;
}
return true;
}
在任何一种情况下,您可能需要评估(询问)是否应将空字符串视为回文结构。
答案 1 :(得分:1)
你的代码太长了。有一种简单的方法:在字符串的元素上迭代一次,将n-1与0和n-2与1进行比较,依此类推。
如果两个字符不相同则返回false,否则继续检查:
bool checkPalindrome(char* str) {
const int size = strlen(str);
for(int i(0), j(size) - 1); i < size / 2; i++, j--)
if(str[i] != str[j])
return false;
return true;
}
int main(){
char* str = "level";
cout << checkPalindrome(str);
cout << endl << endl;
return 0;
}
答案 2 :(得分:0)
基于字符串和迭代器的C ++版本(仅为了完整性,其他答案已经非常好):
bool checkPalindrome(const string& str) {
for (auto p = str.begin(),q = str.end(); p!=q && p!=q+1; p++ )
if (*p!=*--q) // if char from front doesn't match char from rear ?
return false; // then it's not a palindrome !
return true;
}
说明: 迭代器p
从字符串的前面开始,q
在后面(在最后一个字符之后)。 p
会提前,q
会倒退。如果p
到达q
或p
已经过q
(特殊情况,如果该字的长度均匀),那么结束了,我们可以结束回文。但是,如果之前,p
处的字符与q
之前的字符之间存在任何差异,则它不是回文。