【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心

该文讨论了一种算法问题,即给定两个相同长度的字符串a和b,判断是否能通过分割得到回文串。方法是使用双指针寻找最长前后缀匹配,然后检查剩余子串是否为回文。时间复杂度和空间复杂度均为线性。

分割两个字符串得到回文串【LC1616】

给你两个字符串 ab ,它们长度相同。请你选择一个下标,将两个字符串都在 相同的下标 分割开。由 a 可以得到两个字符串: aprefixasuffix ,满足 a = aprefix + asuffix ,同理,由 b 可以得到两个字符串 bprefixbsuffix ,满足 b = bprefix + bsuffix 。请你判断 aprefix + bsuffix 或者 bprefix + asuffix 能否构成回文串。

当你将一个字符串 s 分割成 sprefixssuffix 时, ssuffix 或者 sprefix 可以为空。比方说, s = "abc" 那么 "" + "abc""a" + "bc" "ab" + "c""abc" + "" 都是合法分割。

如果 能构成回文字符串 ,那么请返回 true,否则返回 false

注意x + y 表示连接字符串 xy

分割点没有判断好 加油

  • 思路

    对于aprefix + bsuffix这种情况,我们可以使用双指针,一个指针iii指向a的头部,另一个字符串指向b的末尾,找到前后缀最长匹配的位置【贪心 最长时中间字符串的长度越少 越有可能是回文字符串】,此时会出现两种情况

    • 如果此时i≥ji\ge jij,那么在位置[i,j][i,j][i,j]分割均可以构成回文串,返回true
    • 如果此时i<ji\lt ji<j,那么可能的分割位置有两个iii或者jjj,此时需要判断字符串a[i+1,j−1]a[i+1,j-1]a[i+1,j1]b[i+1,j−1]b[i+1, j-1]b[i+1,j1]是否是回文字符串,如果是,那么可以构成回文串,返回true
  • 实现

    class Solution {
        public boolean checkPalindromeFormation(String a, String b) {
           return check(a, b) || check(b, a);
    
        }
        public boolean check(String a, String b){
            int i = 0, j = b.length() - 1;
            while (i < j && a.charAt(i) == b.charAt(j)){
                i++;
                j--;
            }
            return i >= j || isPalindrome(a, i, j) || isPalindrome(b, i, j);
    
        }
        public boolean isPalindrome(String s, int i, int j){
            while (i < j && s.charAt(i) == s.charAt(j)){
                i++;
                j--;
            }
            return i >= j;
        }
    }
    
    • 复杂度分析

      • 时间复杂度:O(n)O(n)O(n)
      • 空间复杂度:O(1)O(1)O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值