http://en.wikipedia.org/wiki/Longest_palindromic_substring
算法可以在以下文献中找到:对于rks提供的解决方案,需要指出这个解决方案不可行。例如对于一个字符串S = 1121,它会创建一个字符串11211121,其中回文长度大于或等于S的长度,但它不是旋转回文。如果我们改变解决方案,检查是否存在长度等于S长度的回文,则可以解决问题,但我没有看到任何直接的解决方案如何更改搜索最长子串的算法,以便它可以搜索固定长度(len(S))的子串。(由于我在Stackoverflow上是新手,没有足够的声望来发表评论)
第二点说明--很抱歉没有包括Manacher算法的思路或实现,如果有人有相关链接,请在评论中包含。
>=
,这个算法是否正确,我不确定了。 - rks#Given a string, check if it is a rotation of a palindrome.
#For example your function should return true for “aab” as it is a rotation of “aba”.
string1 = input("Enter the first string")
def check_palindrome(string1):
#string1_list = [word1 for word1 in string1]
#print(string1_list)
string1_rotated = string1[1::1] + string1[0]
print(string1_rotated)
string1_rotated_palindrome = string1_rotated[-1::-1]
print(string1_rotated_palindrome)
if string1_rotated == string1_rotated_palindrome:
return True
else:
return False
isPalindrome = check_palindrome(string1)
if(isPalindrome):
print("Rotated string is palindrome as well")
else:
print("Rotated string is not palindrome")
34321123432112
中搜索回文? - DarthVader我想提出一个简单的解决方案,只使用传统算法。它不能解决任何更难的问题,但对于您的任务应该足够了。它与其他两个提出的解决方案有些相似,但没有一个看起来足够简洁,让我仔细阅读。
第一步:将字符串连接到自身(abvc
-> abvcabvc
),如所有其他提出的解决方案。
第二步:在新获得的字符串及其反转上执行Rabin-Karp预计算(使用滚动哈希)。
第三步:让字符串长度为n
。对于0...n-1
中的每个索引i
,检查双倍字符串的子字符串[i,i + n - 1]
是否在常数时间内是回文的,使用Rabin-Karp预计算(基本上,在正向和反向方向上获得的子字符串的值应该相等)。
结论:如果第三步找到了任何回文 - 那么该字符串是旋转回文。如果没有 - 那么它不是。
附言:Rabin Karp使用哈希,即使对于不重合的字符串也可能发生碰撞。因此,如果哈希检查引起等式,则进行验证暴力检查是一个好主意。尽管如此,如果在Rabin Karp中使用的哈希函数很好,解决方案的平摊速度应该保持O(n)
。
你可以将相同的模式添加到原始模式的末尾。例如,模式是1234321,则可以将相同的模式添加到末尾12343211234321。完成此操作后,您可以使用KMP或其他子字符串匹配算法来查找所需的字符串。如果匹配,则返回true。
123217898
是否是旋转回文数?(换句话说,它能否被切成两个以上的子字符串) - saul672123217898
不是一个旋转回文。 - DarthVader