LeetCode:1616. 分割两个字符串得到回文串

文章介绍了如何使用双指针策略解决LeetCode上的一个问题,即判断两个等长字符串分割后组合能否形成回文串。通过分析字符串首尾匹配情况,逐步缩小判断范围,最后检查剩余部分是否为回文串来得出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日一题,双指针!

题目链接: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;
    }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值