1. 问题描述:
给你两个字符串 a 和 b ,它们长度相同。请你选择一个下标,将两个字符串都在相同的下标 分割开。由 a 可以得到两个字符串: aprefix 和 asuffix ,满足 a = aprefix + asuffix ,同理,由 b 可以得到两个字符串 bprefix 和 bsuffix ,满足 b = bprefix + bsuffix 。请你判断 aprefix + bsuffix 或者 bprefix + asuffix 能否构成回文串。
当你将一个字符串 s 分割成 sprefix 和 ssuffix 时, ssuffix 或者 sprefix 可以为空。比方说, s = "abc" 那么 "" + "abc" , "a" + "bc" , "ab" + "c" 和 "abc" + "" 都是合法分割。
如果 能构成回文字符串 ,那么请返回 true,否则返回 false 。
请注意, x + y 表示连接字符串 x 和 y 。
示例 1:
输入:a = "x", b = "y"
输出:true
解释:如果 a 或者 b 是回文串,那么答案一定为 true ,因为你可以如下分割:
aprefix = "", asuffix = "x"
bprefix = "", bsuffix = "y"
那么 aprefix + bsuffix = "" + "y" = "y" 是回文串。
示例 2:
输入:a = "ulacfd", b = "jizalu"
输出:true
解释:在下标为 3 处分割:
aprefix = "ula", asuffix = "cfd"
bprefix = "jiz", bsuffix = "alu"
那么 aprefix + bsuffix = "ula" + "alu" = "ulaalu" 是回文串。
提示:
1 <= a.length, b.length <= 105
a.length == b.length
a
和b
都只包含小写英文字母
2. 思路分析:
① 分析题目可以知道我们需要在某一个位置将字符串a, b进行分割,使得a = aprefix + asuffix , b = bprefix + bsuffix,我们需要判断的是aprefix + bsuffix或者 bprefix + asuffix 能否构成回文串,我们可以写出具体的例子来帮助我们理解其中的实现过程,一个比较简单的想法是一开始的时候扫描字符串a, b的对应的开始位置与结束位置,即i = 0, j = len(a) - 1 - i这样可以在字符串a的开始与字符串b的结束位置开始匹配:先匹配一下对应位置是否相等,假如对应位置相等,说明当前位置截取字符串a,字符串b是可以构成回文的,假如不相等那么重点来了,由具体的例子分析是存在两种情况的:
第一种情况是:
"aejbaalflrmkswrydwdkdwdyrwskmrlfqizjezd",
"uvebspqckawkhbrtlqwblfwzfptanhiglaabjea"
字符串a与字符串b的开始位置与结束位置的字符串是构成回文的,字符串a的:aejbaal,字符串b的:laabjea,接下来需要判断字符串a中从不匹配的位置开始的字符串的对应位置是否构成回文,设字符串a与字符串b不匹配的位置为i,那么我们需要判断出字符串a中从i到n - 1 - i的位置是否回文即可,假如i到n - 1 - i的位置是回文那么字符串a从0到n - 1 - i这个位置截取的字符串与字符串b相同位置截取的字符串那么肯定是构成回文的
上面的例子就是这样的,字符串a中的aejbaal与字符串b中的laabjea构成回文,并且从字符串a中不匹配的位置开始到 n - 1 - i这个位置的字符串也是回文,也就是flrmkswrydwdkdwdyrwskmrlf这个字符串是回文,所以最后字符串a截取的字符串为aejbaalflrmkswrydwdkdwdyrwskmrlf + 字符串b中截取的laabjea拼接起来的字符串就是回文串了
第二种情况是:
"pvhmupgqeltozftlmfjjde"
"yjgpzbezspnnpszebzmhvp"
与第一种的情况类似,这里是字符串a的开始位置到某个位置与字符串b的结束位置往前的某个位置是可以构成回文的,从a中不匹配的位置开始,假设不匹配的位置为i,我们与第一种情况不同的是这里检查的是字符串b的i位置到n - 1 - i的位置是否是回文,因为这个时候我们是可以从当前a中不匹配的位置截取字符串,假如字符串b中从i位置到n - 1 - i位置的字符串是回文那么最终拼接之后也是可以构成回文的
上面的例子就是这样的:字符串a中截取的pvhm + zbezspnnpszebzmhvp是可以构成回文的
假设不匹配的位置为i,则:
a:[0:i] + [i:n - 1 - i] b:[n - 1 - i: n]
a:[0:i] b:[i:n - 1 - i] + [n - 1 - i:n]
截取的i位置还是n - i - i位置
所以我们可以使用两个方法进行分别从不匹配的位置开始分别检测字符串a或者是b
② 其实仔细分析可以知道我们将字符串进行翻转之后那么就可以从不匹配的位置开始只检测字符串a即可,也就是使用一个方法可以解决
3. 代码如下:
class Solution:
def check(self, a: str, b: str):
n = len(a)
flag = True
for i in range(n // 2):
if flag:
if a[i] != b[n - 1 - i]:
flag = False
if not flag:
if b[i] != b[n - 1 - i]:
return False
return True
def check2(self, a: str, b: str):
n = len(a)
flag = True
for i in range(n // 2):
if flag:
if a[i] != b[n - 1 - i]:
flag = False
if not flag:
if a[i] != a[n - 1 - i]:
return False
return True
def checkPalindromeFormation(self, a: str, b: str) -> bool:
if self.check(a, b) or self.check(b, a): return True
if self.check2(a, b) or self.check2(b, a): return True
return False
翻转字符串:
class Solution:
def check(self, a: str, b: str):
n = len(a)
flag = True
for i in range(n // 2):
if flag:
if a[i] != b[n - 1 - i]:
flag = False
if not flag:
if a[i] != a[n - 1 - i]:
return False
return True
def checkPalindromeFormation(self, a: str, b: str) -> bool:
if self.check(a, b) or self.check(b, a): return True
a = a[::-1]
b = b[::-1]
if self.check(a, b) or self.check(b, a): return True
return False