检查字符串是否旋转回落的有效方法

时间:2016-01-10 23:13:15

标签: c string algorithm

我一直在找方法找到有效的方法来检查一个字符串是否旋转回落,并且除了O(n ^ 2)解决方案之外我发现SO post谈到O(n)解决方案似乎相当复杂。我写了下面的代码,我认为它在O(n)中实现了一个更简单的哈希表格式的解决方案。有人看看它,看看我在这里遗漏了什么或者我的解决方案是否正确?

/*Code doesnt cover scenarios where character is caps and space*/

int main(void)
{
    char str[] = "123217898";
    char *pstr = str;
    int length = strlen(str);
    int notdouble = 0;


    int arr[256] = { 0 };

    for (int i = 0; i < length; i++)
    {
        arr[*pstr]++;
        pstr++;
    }

    pstr = str;

    for (int i = 0; i < length; i++)
    {
        /*check if its divisible by 2 and greater than 2*/
        if (arr[*pstr] % 2 != 0 && arr[*pstr] > 2)
        {
            notdouble = 5;   // just assign random value greater than 1
        }

        if (arr[*pstr] == 1)
        {
            notdouble++;
        }
        pstr++;
    }

    if (notdouble > 1)
    {
        printf("string is not palindrome \n");
    }
    else
    {
        printf("string is palindrome \n");
    }

    return 0;
}

1 个答案:

答案 0 :(得分:3)

您的代码不会测试旋转的回文,它只会检查是否存在偶数个重复字符。这不符合回文,也不符合旋转的回文。

此外,回文或旋转的回文可以包含一个具有奇数的字符。

换句话说,以下两个例子被错误地分类:

  • "221133" - 这不是一个旋转的回文,即使有多个重复的字符。
  • "114321234" - 这是一个旋转的回文,但1的奇数是三,而不是一个......