题目链接
Leetcode.1616 分割两个字符串得到回文串 Rating : 1868
题目描述
给你两个字符串 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 = “abdef”, b = “fecab”
输出:true
示例 3:
输入:a = “ulacfd”, b = “jizalu”
输出:true
解释:在下标为 3 处分割:
aprefix = “ula”, asuffix = “cfd”
bprefix = “jiz”, bsuffix = “alu”
那么 aprefix + bsuffix = “ula” + “alu” = “ulaalu” 是回文串。
提示:
- 1 < = a . l e n g t h , b . l e n g t h < = 1 0 5 1 <= a.length, b.length <= 10^5 1<=a.length,b.length<=105
- a . l e n g t h = = b . l e n g t h a.length == b.length a.length==b.length
a
和b
都只包含小写英文字母
解法:双指针
我们考虑如何分割才能让 prefix + suffix
组成一个回文串。
红色的部分就是已经匹配的了。
我们要讨论的就是 a
和 b
剩下的部分 s
和 p
。
- 如果
s
和p
都为空,则a_prefix
和b_suffix
可以组成回文串。 - 如果
s
和p
不为空 -
- 如果
s
或p
是回文串,也可以成立
- 如果
-
- 如果
s
或p
不回文串,那就不成立了
- 如果
时间复杂度: O ( n ) O(n) O(n)
C++代码:
class Solution {
public:
bool isValid(const string &s,int l,int r){
for(int i = l,j = r;i < j;i++,j--){
if(s[i] != s[j]) return false;
}
return true;
}
bool check(const string &a,const string &b){
int n = a.size();
int i = 0,j = n - 1;
for(;i < j;){
if(a[i] != b[j]) break;
i++,j--;
}
return isValid(a,i,j) || isValid(b,i,j);
}
bool checkPalindromeFormation(string a, string b) {
return check(a,b) || check(b,a);
}
};
Python代码:
class Solution:
def checkPalindromeFormation(self, a: str, b: str) -> bool:
def isPalindrome(a:str,b:str) -> bool:
i , j = 0 , len(a) - 1
while i < j and a[i] == b[j]:
i += 1
j -= 1
s = a[i:j+1]
p = b[i:j+1]
return s == s[::-1] or p == p[::-1]
return isPalindrome(a,b) or isPalindrome(b,a)