leetcode——分割两个字符串得到一个回文字符串(java)

给你两个字符串 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

示例 1:

输入:a = "x", b = "y"
输出:true
解释:如果 a 或者 b 是回文串,那么答案一定为 true ,因为你可以如下分割:
aprefix = "", asuffix = "x"
bprefix = "", bsuffix = "y"
那么 aprefix + bsuffix = "" + "y" = "y" 是回文串。

示例 2:

输入:a = "xbdef", b = "xecab"
输出:false

示例 3:

输入:a = "ulacfd", b = "jizalu"
输出:true
解释:在下标为 3 处分割:
aprefix = "ula", asuffix = "cfd"
bprefix = "jiz", bsuffix = "alu"
那么 aprefix + bsuffix = "ula" + "alu" = "ulaalu" 是回文串。

解题方法:(相向双指针)

1.经分析得出这道题需要检查字符串是否为回文字符串,以及a的前缀与b的后缀||a的后缀与b的前缀是否能够组成回文串。

2.所以我们需要两个辅助函数来帮我们完成任务,首先一个辅助函数用来检查该字符串是否为回文字符串,这是用来后面判断剩余的字符串是否为回文串的。

3.然后我们需要用另一个辅助函数来进行检查切割后的字符串能否组成回文字符串,但是我们不能给切割切割两个字吓到了,我们其实只需要左右双指针就行,一个指向前一个字符串的首位,一个指向另一个字符串的末尾,然后同时移动双指针,判断所指向的元素是否相等即可,最后再判断剩下的字符串是否相等。

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

你可能感兴趣的:(leetcode,java,算法)