1

我编写了一个程序来查找字符串中所有可能的回文。代码如下

#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
  clrscr();
  char *ptr1;
  char str[100];
  printf("enter the string with even length\n");
  gets(str);
  int n;
  int i=strlen(str);
  if(i%2==0)
  {
    for(int n=0;n<=strlen(str);n++)
    {
      for(int k=1;k<=strlen(str);k++)
      {
        int m=0;
        int j=0;
        ptr1=str;
        while(*ptr1!='\0')
        {
          ptr1+;
          j++;
          m++;
        }
        j=j-k;
        for(i=n;i<m/2;i++,j--)
        {
          if(str[i]!=str[j])
          {
            break;
          }
        }
        if(j<=i)
          printf("String is a palindrome\n");
        else
          printf("String is not a palindrome\n");
      }
    }
  }
  else
  {
    printf("String is of odd length");
  }
  getch();
}

但是我得到的打印语句的数量超过了它需要显示的数量。谁能帮我写代码并告诉我哪里出了问题。

4

2 回答 2

2

我不确定是否有一种简单的方法可以在字符串中找到“所有可能的”回文。需要考虑几个因素和假设:

(1) 我们要烧烤的每个子串的最小和最大长度。否则,每一个字符本身就是一个回文!最大值当然是小于字符串长度的数字(一?)

(2) 在我们选择子字符串之前,我们是否应该坚持字符的原始排列(根据给定的输入)?或者,程序是否应该首先自己生成可能的排列,然后检查由此获得的字符串。

(3) 更复杂的是,如果一个输入字符出现两次(或更多),那么将至少有两个(或更多)具有相似字符排列的子串。这将需要额外的逻辑来抑制重复...(字符串数组)

我强烈认为上面叙述的内容对于您可能拥有的“实际”要求应该是多余的。然而,回到检查回文问题的根源,认为双指针方法可能是一种简单且资源较少的解决方案。例如(以静态输入说明):

char str[10] = "rotator";
int str_length = strlen(str);
int palindrome_flag = 1;
char *ptr1 = str;
char *ptr2 = ptr1 + str_length - 1;

while(ptr1 <= ptr2){
    if(*ptr1 != *ptr2){
        palindrome_flag = 0;
        break;
    }

    ptr1++;
    ptr2--;
}

if(palindrome_flag){
    printf("\n String \"%s\" is a palindrome", str);
}
else{
    printf("\n String \"%s\" is not a palindrome", str);
}

return 0;

希望这可以帮助?谢谢你。

于 2013-08-23T09:54:01.757 回答
0

这段代码似乎可以工作,但仍有改进的余地。逻辑很简单,检查回文中的回文。保持两个数。保持一个计数不变并增加另一个计数。检查这两个计数字符是否相同。如果我们没有找到相同的然后退出并增加另一个计数器。一旦第二个计数器结束,增加第一个计数器和第一个计数器的第二个计数器 +1。

#include <stdio.h>
#include <string.h>

int main()
{
        int i, j, k, p, count, m, found;
        char str[20];

        k = p = count = m = found = 0;

        printf("enter a string\n");
        scanf("%s", str);
        printf("string %s\n", str);
        printf("length %d\n", strlen(str));

        for (i = 0; i < strlen(str); i++) {
                for (j = i + 1; j < strlen(str); j++) {
                        for (k = i, p = j; k <= p; k++, p--) {

                                if (str[k] == str[p])
                                        found = 1;
                                else {
                                        found = 0;
                                        break;
                                }
                        }
                        if (found) {
                                count++;
                                printf("found count %d\n", count);
                        }
                }
        }
        printf("-- count = %d\n", count);

        return 0;
    }
于 2020-10-04T17:00:03.590 回答