【问题标题】:Efficient way to check if a string is rotated palindrome检查字符串是否旋转回文的有效方法
【发布时间】:2016-01-10 23:13:15
【问题描述】:

我一直在寻找有效的方法来检查字符串是否旋转回文,除了 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;
}

【问题讨论】:

  • 我投票结束这个问题,因为它是关于代码审查的(试试codereview.stackexchange.com)。
  • 以前问过question
  • @WeatherVane - 我本人已经提供了该链接 - 问题讨论了更简单的替代解决方案。我正在寻找答案来检查我的逻辑是否存在漏洞,因为没有人建议这样做
  • 哦 - 对不起。当我在谷歌上搜索“旋转回文”时,它是最高条目
  • @OliverCharlesworth - 不仅仅是代码审查,我正在寻找对部分逻辑的验证,它提供了比相关的复杂方法更简单的替代方案。如果人们不同意这里,我不介意将其发布在代码审查中..

标签: c string algorithm


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的指点。似乎随着旋转,我假设所有排列都会发生一次,这就是算法失败的地方。是的,正如你指出的那样,在某些情况下,一个字符数也可以是 3(我认为我可以破解代码),但这不会解决问题,因为我的代码假设所有排列。再次感谢!!!
  • 代码检查奇数并发计数,如果有的话,允许恰好一个字符出现一次:permuted回文(并非所有回文字谜都被接受)。
  • @greybeard 是的,但是当允许字符多次出现(和旋转)时,总数可能是奇数个字符
  • @greybeard 以下是回文数:555123454321555,其中 5 的个数是奇数而不是一。
  • @greybeard 已旋转。将第一个字符移到末尾,您会看到回文
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 2016-01-31
  • 2012-09-03
  • 2013-02-13
  • 2017-03-29
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
相关资源
最近更新 更多