每日一题,双指针!
题目链接:1616. 分割两个字符串得到回文串 - 力扣(LeetCode)
题目信息:
给你两个字符串 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

题目解析:
如下图:给定两个等长字符串a,b;a1+b2或b1+a2是回文串的返回true,否则false。

图一 图二 图三 图四
解题方法:双指针
代码及超详细解析:
先讲思路:
由图一所示切割出空串,则是判断a2,b2是否为回文串;
由图二所示,在第一个字符后切割,若a1与b2末尾是回文,则判断b2粗体部分(bohgu)是否为回文串;此时b1与a2末尾不回文,后不再赘述
由图三所示,在第二个字符后切割,则判断b2粗体部分(ohg)是否为回文串;
由图四所示,在第三个字符后切割,则判b2断粗体部分(h)是否为回文数;【单个字母时回文串】
综上所述,我们只需从a首字符与b尾字符开始遍历直到两字符不同时,记录当前指针l,r的值;
若l>=r:则a1+b2一定是回文串
>:如图:l=3,r=2

=:a1,b2之间还有一个字符,如图四
若l<r:再判断b2中l到r字符是否是回文串、a2中l到r字符是否是回文串即可
如图:判断b2[2]~b2[4]

代码:

class Solution {
public boolean checkPalindromeFormation(String a, String b) {
int r=a.length()-1;
int l=0;
//IsPalindrome()有两个字符串参数的是遍历到两字符串中不同的l和r
//一个字符串参数的是遍历b2中l到r的字符串是否为回文串
return IsPalindrome(a,b,l,r)||IsPalindrome(b,a,l,r);
}
public boolean IsPalindrome(String a,String b,int l,int r)
{
while(l<r&&a.charAt(l)==b.charAt(r))
{
l++;//左指针向右走
r--;//右指针向左走
}
if(l>=r)return true;
return IsPalindrome(a,l,r)||IsPalindrome(b,l,r);//一定注意是两个字符串都要判断l~r的字符是否为回文
}
public boolean IsPalindrome(String a,int l,int r)
{
while(l<r&&a.charAt(l)==a.charAt(r))
{
l++;
r--;
}
if(l>=r)return true;
return false;
}
}