字符串
给你两个字符串 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 = "ulacfd", b = "jizalu"输出:true解释:在下标为 3 处分割:aprefix = "ula", asuffix = "cfd"bprefix = "jiz", bsuffix = "alu"那么 aprefix + bsuffix = "ula" + "alu" = "ulaalu" 是回文串。
提示:
1 <= a.length, b.length <= 105a.length == b.lengtha 和 b 都只包含小写英文字母题目要点:
A 字符的前缀字符和 B 字符的后缀字符组合,B 字符的前缀字符和 A 字符的后缀字符组合,组合的字符是否为回文字符要使组合后的字符串为回文字符,那么分别从 A 字符开端和 B 字符末端向内收缩,必然有一段子字符是必然相同的。
找到 A 和 B 相同公共字符的索引后,在用这两个索引在各自字符串内遍历收缩,直至两个索引指向的字符不相等为止。
如果判断为不相等的字符的两个索引已经超越边界,例如 end < start,那么表明到达不相等索引之前的遍历字符都是相等的。
这里需要分别对 A 和 B 进行一次检验,因为有可能是 A 的 start 向后推,也有可能是 B 的 end 向前推。
const checkPalindromeFormation = function(a, b) {function isPalindrome(a, b) {let start = 0,end = a.length - 1,i,j;// 第一步:找到两个字符各自两端最长公共回文子字符的下标while (start < end) {if (a[start] === b[end]) {start++;end--;continue;}break;}i = start;j = end;// 第二步:重置 i 和 j 遍历字符串 bwhile (i < j) {if (b[i] === b[j]) {i++;j--;continue;}break;}if (i >= j) return true;i = start;j = end;// 第三步:重置 i 和 j 遍历字符串 awhile (i < j) {if (a[i] === a[j]) {i++;j--;}}if (i >= j) return true;return false;}return isPalindrome(a, b) || isPalindrome(b, a);};
参考资料: