1616. 分割两个字符串得到回文串
给你两个字符串 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)先判断aprex+bsuffix 是否构成回文数
首先找到a的前缀和b后缀相等的最大长度i 有两种切割方法,第一种把a从第i位置切割,然后只需要判断b 从i 到 b.length()-i-1这个子串是否是回文数,如果是 str1为true否则,str1为false;
第二种 把b在b.length()-i-1切割,拼接在a上判断 a 从i 到 a.length()-i-1这个子串是否是回文数,如果是 str2为true;否则,str2为false。
str1 ,str2 只要一个为真,则函数返回真。
(2)然后判断bprex+asuffix 是否构成回文数
首先找到b的前缀和a后缀相等的最大长度i 有两种切割方法,第一种把b从第i位置切割,然后只需要判断a从i 到 a.length()-i-1这个子串是否是回文数,如果是 str1为true否则,str1为false;
第二种 把a在b.length()-i-1切割,拼接在b上判断 b 从i 到 b.length()-i-1这个子串是否是回文数,如果是 str2为true;否则,str2为false。
str1 ,str2 只要一个为真,则函数返回真。
(3)如果aprex+bsuffix 和bprex+asuffix 都不能构成回文数,该函数返回false
代码如下:
class Solution {
bool check(string a)
{
for(int i=0,j=a.length()-1;i<j;i++,j--)
{
if(a[i]!=a[j])
return false;
}
return true;
}
public:
bool checkPalindromeFormation(string a, string b) {
if(check(a)||check(b))
return true;
bool str1=true;
bool str2=true;
bool s1=true;
bool s2=true;
int i,j;
for( i=0,j=a.length()-1;i<j;i++,j--)
{
if(a[i]!=b[j])
break;
}
while(i<j)
{
if(b[i]!=b[a.length()-1-i])
{
str1=false;
}
if(a[a.length()-1-i]!=a[i])
{
str2=false;
}
if(!str2&&!str1)
{
s1=false;
break;
}
i++;
}
if(s1)
return true;
for( i=0,j=a.length()-1;i<j;i++,j--)
{
if(b[i]!=a[j])
break;
}
str1 = true;
str2 = true;
while(i<j)
{
if(b[i]!=b[a.length()-1-i])
{
str1=false;
}
if(a[a.length()-1-i]!=a[i])
{
str2=false;
}
if(!str2&&!str1)
{
s2=false;
break;
}
i++;
}
return s2;
}
};