算法笔记第五天 2023.03.18力扣1616题

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;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值