在C中检查给定字符串是否为回文的有效方法

时间:2013-10-07 15:58:08

标签: c string pointers palindrome

我正在准备我的面试,并从简单的C编程问题开始工作。我遇到的一个问题是检查给定的字符串是否是回文。我写了一个代码来查找用户指定字符串是否是使用指针的回文。我想知道这是否是运行时方面的有效方法,还是我可以做的任何增强。如果有人建议如何在使用指针时删除除字母之外的其他字符(如撇号comas),那将是很好的。我在下面添加了我的功能。它接受一个指向字符串的指针作为参数并返回整数。

int palindrome(char* string)
{
    char *ptr1=string;
    char *ptr2=string+strlen(string)-1;
    while(ptr2>ptr1){
        if(tolower(*ptr1)!=tolower(*ptr2)){
            return(0);
        }
        ptr1++;ptr2--;
    }
    return(1);
}

4 个答案:

答案 0 :(得分:5)

“如何删除除字母以外的其他字符?”

我认为您不想实际删除它,只需跳过它就可以使用isalpha来执行此操作。另请注意,条件ptr2 > ptr1仅适用于abba等字符数较多的字符串,但对于abcba等字符串,条件应为ptr2 >= ptr1

int palindrome(char* string)
{
    size_t len = strlen(string);

    // handle empty string and string of length 1:
    if (len == 0) return 0;
    if (len == 1) return 1;

    char *ptr1 = string;
    char *ptr2 = string + len - 1;
    while(ptr2 >= ptr1) {
        if (!isalpha(*ptr2)) {
            ptr2--;
            continue;
        }
        if (!isalpha(*ptr1)) {
            ptr1++;
            continue;
        }
        if( tolower(*ptr1) != tolower(*ptr2)) {
            return 0;
        }
        ptr1++; ptr2--;
    }
    return 1;
}

您可能需要#include <ctype.h>

答案 1 :(得分:0)

如果你只想使用指针来做这样的事情怎么样:

int main()
{
 char str[100];
 char *p,*t;
 printf("Your string : ");
 gets(str);
 for(p=str ; *p!=NULL ; p++);
  for(t=str, p-- ; p>=t; )
  {
    if(*p==*t)
    {
        p--;
        t++;
    }
    else
        break;
  }
  if(t>p)
       printf("\nPalindrome");
  else
       printf("\nNot a palindrome");
  getch();
  return 0;
}

答案 2 :(得分:0)

int main()
{   

const char *p = "MALAYALAM";

int count = 0;
int len = strlen(p);
for(int i = 0; i < len; i++ )
{
    if(p[i] == p[len - i - 1])
        count++;
}

cout << "Count: " << count;
if(count == len)
    cout << "Palindrome";
else
    cout << "Not Palindrome";

return 0;
}

答案 3 :(得分:-1)

我实际上已经对这类问题进行了很多实验。

可以做两种优化:

  • 检查奇数字符串长度,奇怪的字刺不能是回文
  • 开始使用矢量化比较,但如果您期望大量的回文,这只会给您带来性能。如果您的大多数字符串都不是回文,那么您仍然可以进行逐字节比较。实际上,我的矢量化回文检查比非矢量化的速度慢了5%,因为回文中的回文非常罕见。决定矢量化和非矢量化的额外分支产生了很大的不同。

以下是代码草案,您可以如何进行矢量化:

int palindrome(char* string)
{
    size_t length = strlen(string);

    if (length >= sizeof(uintptr_t)) { // if the string fits into a vector
        uintptr_t * ptr1 = (uintptr_t*)string;
        size_t length_v /= sizeof(uintptr_t);
        uintptr_t * ptr2 = (uintptr_t*)(string + (length - (length_v * sizeof(uintptr_t)))) + length_v - 1;

        while(ptr2>ptr1){
            if(*ptr1 != bswap(*ptr2)){ // byte swap for your word length, x86 has an instruction for it, needs to be defined separately
                return(0);
            }
            ptr1++;ptr2--;
        }

    } else {
        // standard byte by byte comparison
    }
    return(1);
}