我一直在找方法找到有效的方法来检查一个字符串是否旋转回落,并且除了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;
}
答案 0 :(得分:3)
您的代码不会测试旋转的回文,它只会检查是否存在偶数个重复字符。这不符合回文,也不符合旋转的回文。
此外,回文或旋转的回文可以包含一个具有奇数的字符。
换句话说,以下两个例子被错误地分类:
"221133"
- 这不是一个旋转的回文,即使有多个重复的字符。"114321234"
- 这是一个旋转的回文,但1
的奇数是三,而不是一个......