用于确定两个字符串是否是特定索引处的回文的算法



给定两个长度相等的字符串 A 和 B,查找是否可以拆分 两个字符串位于同一索引处,以便合并 A 的第一部分和第二部分 B的一部分形成回文。返回拆分的位置。回文是一个词 向后和向前读相同。 如果找不到解决方案,则返回 -1。

这是我到目前为止所拥有的

def palindrome(str1, str2):
if len(str1) != len(str2):
return None
for i in range(len(str1)):
firstStr = str1[i:]
secondStr = str2[:i]
if isPalindrome(firstStr+secondStr):
return i
return -1

def isPalindrome(s):
return s == s[::-1]

print(palindrome('abcdefgh', 'dasedcba'))

我的解决方案返回测试用例的-1,尽管它应该返回4

我不确定要更改什么以确保返回正确的索引。

根据您的问题,您想合并 A 的第一部分 (str1( 和 B 的第二部分 (str2(,但在您的代码中您正在做相反的事情,只需在str1上切换切片并str2

firstStr = str1[:i]   # from the start up to i (first part of str1)
secondStr = str2[i:]  # from i to up the end (second part of str2)

测试:

def palindrome(str1, str2):
if len(str1) != len(str2):
return None
for i in range(len(str1)):
firstStr = str1[:i]
secondStr = str2[i:]
if isPalindrome(firstStr+secondStr):
return i
return -1
def isPalindrome(s):
return s == s[::-1]
print(palindrome('abcdefgh', 'dasedcba'))

输出:

4

您没有正确获取第一个字符串的第一部分和第二个字符串的第二部分。请记住,当您对字符串进行切片时:

>>> s = 'abcdefgh'
>>> s[:4] # this will take the first 4 elements of s
'abcd'
>>> s[4:] # this will take a sub-string from the 5th element at index 4 until the end of s
'efgh'

因此,您应该更改代码:

def palindrome(str1, str2):
if len(str1) != len(str2):
raise ValueError('str1 and str2 should have the same length')
for i in range(len(str1)):
firstStr = str1[:i]
secondStr = str2[i:]
if isPalindrome(firstStr + secondStr):
return i
return -1

还要记住以下几点,如果两个字符串str1str2的长度不同,则返回None,因此您可以只写return,因为它会隐式返回None。但是,我认为最好提出一个异常,告诉用户str1str2的长度不同。

你也应该只是颠倒你的话,然后以这种方式运行你的支票:

reverse_word = 单词 [::-1]

最新更新