真的需要帮助!
此代码应在字符串中找到最大的回文。这意味着,如果有" abcdcba"和" cdc"在同一个字符串中,它应该打印" abcdcba"因为长度较长。该函数采用字符串str和2个点i和j,并确定从i到j的字符串是否是回文。如果它是回文,则返回回文的长度,如果不是,则返回-1。
int palindromelength(char *str, int i, int j){
int *first = &i, *last = &j;
int len;
while (first < last){
if (toupper(*first) != toupper(*last))
return -1;
first++;
last--;
}
len = last - first;
return (len);
}
int main() {
int length, i, j;
char str;
scanf("%s", &str);
length = strlen(str);
printf("Length = %d\n", palindromelength(str, i, j));
//should print out largest palindrome.
return 0;
}
答案 0 :(得分:1)
因此该函数应该返回j-i或-1
char str;
scanf("%s", &str);
这不是你应该如何声明然后初始化一个字符串。改为使用:
char str[512];
scanf ("%s", str);
另请注意,您需要让用户输入该字符串的长度,并且您需要将该长度作为参数传递给&#34;回文长度&#34;功能
您可以像这样访问字符串的第(i + 1)条:
STR [1]
但之前,您需要检查我是否严格低于字符串的长度。并且不要忘记在main()函数中初始化i和j
答案 1 :(得分:1)
您向函数发送一个字符串和两个索引,然后立即获取两个索引的地址,然后继续增加/减少索引,而不考虑您的字符串。这永远不会让你到任何地方。
虽然可以尝试与索引作为整数进行所有比较,但是找到操作字符串和字符的回文可能会更容易一些。您可以使用索引在字符串中设置开始和结束位置。索引本身就是数字。您的first
和last
不应该保留intergers
的地址,它们应该包含第一个和最后一个 {的地址{1}}您的搜索字符串。
以下是使用索引查找搜索的开始和结束字符的快速示例。注意:我对characters
使用p
(指针),为first
使用ep
(结束指针)。查看逻辑,如果您有疑问,请告诉我。该程序在字符串(基于last
的索引)中采用3
个参数,string
,start
和end
索引:
0
<强>输出强>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXP 128
int get_palindrome (char *s, size_t i, size_t j);
int main (int argc, char **argv) {
if (argc < 4 ) {
fprintf (stderr, "error: insufficient input, usage: %s str i j\n", argv[0]);
return 1;
}
size_t i = atoi (argv[2]);
size_t j = atoi (argv[3]);
char palindrome[MAXP] = {0};
int len = get_palindrome (argv[1], i, j);
if (len > 0)
{
strncpy (palindrome, argv[1] + i, len);
printf ("\n palindrome: %s (%d chars)\n\n",
palindrome, len);
}
else
printf ("\n no palindrome for for given indexes.\n\n");
return 0;
}
int get_palindrome (char *s, size_t i, size_t j)
{
if (!s || *s == 0) return -1;
int len = 0;
char *p = s + i; /* set start/end pointers */
char *ep = s + j + 1;
char *sp = NULL;
int c = *ep; /* save char from string */
*ep = 0; /* null-terminate at end */
char *s2 = strdup (p); /* copy string to s2 */
*ep = c; /* replace original char */
p = s2; /* set s2 start/end ponters */
ep = s2 + j - i;
while (ep > p) /* check for palindrome */
{
if (toupper(*ep) != toupper(*p))
{
*ep = 0;
sp = NULL;
}
else if (!sp)
sp = p;
p++, ep--;
}
len = sp ? (int) strlen (sp) : -1; /* get length */
if (s2) free (s2); /* free copy of string */
return len; /* return len or -1 */
}
注意使用$ ./bin/palindrome 1234abcdcba 4 10
palindrome: abcdcba (7 chars)
类型代替size_t
int
&amp; i
。 j
&amp; i
是索引,对于此问题,不会为负。尽量选择最适合您数据的数据类型。它有助于识别和防止代码中的问题。
另请注意,您应该在函数中复制字符串(如果您担心保留原始字符串)。插入j
字符定位回文将改变原始字符串。
答案 2 :(得分:0)
有一个易于理解的解决方案,找出字符串中最长的回文。
关键概念:在回文的中心,角色总是形式为
&#34; .... x y x ....&#34;或者&#34; ...... x x ......&#34;
步骤1:从xyx或xx模式的开始到结束扫描字符串,并将中心索引存储在辅助数组中。
第二步:现在围绕每个中心尝试在两个方向上扩展字符串并存储长度。
第3步:返回最大长度。
此方法需要O(N2)的订购时间。