[英]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.