我写了一个程序来查找字符串中所有可能的回文。代码在
之下#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();
}
但是我得到的印刷语句数量超过了它需要显示的数量。任何人都可以帮我解决这个问题并告诉我哪里出错了。
答案 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>