繁体   English   中英

使用 C 查找字符串中所有可能的回文

[英]Find all possible palindromes in a string using C

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

#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();
}

但是我得到的打印语句数量超过了它需要显示的数量。 任何人都可以帮助我解决代码并告诉我我哪里出错了。

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

(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;

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

这段代码看起来很有效,但仍有改进的余地。 逻辑很简单,检查回文里面的回文。 保持两个数。 保持一个计数不变并增加另一个计数。 检查这两个计数字符是否相同。 如果我们没有找到相同的,则退出并增加另一个计数器。 一旦第二个计数器到达结束,增加第一个计数器和第一个计数器的第二个计数器+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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM