C中最大的回文结构

时间:2015-04-08 01:45:58

标签: c palindrome

真的需要帮助!

此代码应在字符串中找到最大的回文。这意味着,如果有" 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;
}

3 个答案:

答案 0 :(得分:1)

  1. 您描述的内容以及该函数应该执行的操作是不一致的: &#34;该函数采用字符串str和2个点i和j,并确定从i到j的字符串是否是回文。如果它是回文,则返回回文的长度,如果不是,则返回-1&#34;
  2. 因此该函数应该返回j-i或-1

    1. char str; scanf("%s", &str);
    2. 这不是你应该如何声明然后初始化一个字符串。改为使用:

      char str[512];
      scanf ("%s", str);
      

      另请注意,您需要让用户输入该字符串的长度,并且您需要将该长度作为参数传递给&#34;回文长度&#34;功能

      1. 您可以像这样访问字符串的第(i + 1)条:

        STR [1]

      2. 但之前,您需要检查我是否严格低于字符串的长度。并且不要忘记在main()函数中初始化i和j

        1. 在开始编码之前,编写一个伪代码算法,可以解决您的问题并评估其复杂性。在这种情况下,最明显算法的共同性将是O(n ^ 2),其中n是字符串的长度。这个最明显的解决方案是检查每个子字符串,但也许有更好的算法:en.wikipedia.org/wiki/Longest_palindromic_substring

答案 1 :(得分:1)

您向函数发送一个字符串和两个索引,然后立即获取两个索引的地址,然后继续增加/减少索引,而不考虑您的字符串。这永远不会让你到任何地方。

虽然可以尝试与索引作为整数进行所有比较,但是找到操作字符串和字符的回文可能会更容易一些。您可以使用索引在字符串中设置开始结束位置。索引本身就是数字。您的firstlast不应该保留intergers的地址,它们应该包含第一个最后一个 {的地址{1}}您的搜索字符串。

以下是使用索引查找搜索的开始和结束字符的快速示例。注意:我对characters使用p(指针),为first使用ep(结束指针)。查看逻辑,如果您有疑问,请告诉我。该程序在字符串(基于last的索引)中采用3个参数,stringstartend索引:

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; ij&amp; i是索引,对于此问题,不会为负。尽量选择最适合您数据的数据类型。它有助于识别和防止代码中的问题。

另请注意,您应该在函数中复制字符串(如果您担心保留原始字符串)。插入j字符定位回文将改变原始字符串。

答案 2 :(得分:0)

有一个易于理解的解决方案,找出字符串中最长的回文。

关键概念:在回文的中心,角色总是形式为
&#34; .... x y x ....&#34;或者&#34; ...... x x ......&#34;

步骤1:从xyx或xx模式的开始到结束扫描字符串,并将中心索引存储在辅助数组中。

第二步:现在围绕每个中心尝试在两个方向上扩展字符串并存储长度。

第3步:返回最大长度。

此方法需要O(N2)的订购时间。