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

时间:2013-08-22 13:12:52

标签: c palindrome

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

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

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

2 个答案:

答案 0 :(得分:1)

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

(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 :(得分:0)

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

library(dplyr)

test_function <- function(data, ...){
  stats <- data %>% 
    group_by(variable, ...) %>%
    summarize(N = length(value[!is.na(value)]),
              Missing = length(value[is.na(value)]),
              Per.Avail = (length(value[!is.na(value)])/(length(value[!is.na(value)]) + length(value[is.na(value)]))) * 100,
              Mean = mean(value, na.rm=TRUE),
              Median = median(value, na.rm=TRUE),
              Min = min(value, na.rm=TRUE),
              Max = max(value, na.rm=TRUE),
              Range = max(value, na.rm=TRUE) - min(value, na.rm=TRUE),
              Variance = var(value, na.rm=TRUE),
              Std.Dev = sd(value, na.rm=TRUE),
              Coef.Var = sd(value, na.rm=TRUE)/mean(value, na.rm=TRUE),
              SE = sd(value, na.rm=TRUE)/sqrt(length(value[!is.na(value)])),
              Skewness = e1071::skewness(value, na.rm=TRUE),
              Kurtosis = e1071::kurtosis(value, na.rm=TRUE),
              IQR = IQR(value, na.rm=TRUE),
              MAD = mad(value, na.rm=TRUE)
    )
  return(stats)
}

test_function(tested, ym)
#> `summarise()` regrouping output by 'variable' (override with `.groups` argument)
#> # A tibble: 1 x 18
#> # Groups:   variable [1]
#>   variable ym        N Missing Per.Avail  Mean Median   Min   Max Range Variance
#>   <fct>    <chr> <int>   <int>     <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>    <dbl>
#> 1 TA       10-2~    20       0       100  5.30   5.33  4.25  6.01  1.76    0.283
#> # ... with 7 more variables: Std.Dev <dbl>, Coef.Var <dbl>, SE <dbl>,
#> #   Skewness <dbl>, Kurtosis <dbl>, IQR <dbl>, MAD <dbl>

test_function(tested, ym, year, month)
#> `summarise()` regrouping output by 'variable', 'ym', 'year' (override with `.groups` argument)
#> # A tibble: 1 x 20
#> # Groups:   variable, ym, year [1]
#>   variable ym     year month     N Missing Per.Avail  Mean Median   Min   Max
#>   <fct>    <chr> <dbl> <dbl> <int>   <int>     <dbl> <dbl>  <dbl> <dbl> <dbl>
#> 1 TA       10-2~  2019    10    20       0       100  5.30   5.33  4.25  6.01
#> # ... with 9 more variables: Range <dbl>, Variance <dbl>, Std.Dev <dbl>,
#> #   Coef.Var <dbl>, SE <dbl>, Skewness <dbl>, Kurtosis <dbl>, IQR <dbl>,
#> #   MAD <dbl>