分割两个字符串得到回文串【LC1616】
给你两个字符串
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。
分割点没有判断好 加油
-
思路
对于
aprefix + bsuffix这种情况,我们可以使用双指针,一个指针iii指向a的头部,另一个字符串指向b的末尾,找到前后缀最长匹配的位置【贪心 最长时中间字符串的长度越少 越有可能是回文字符串】,此时会出现两种情况- 如果此时i≥ji\ge ji≥j,那么在位置[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,j−1],b[i+1,j−1]b[i+1, j-1]b[i+1,j−1]是否是回文字符串,如果是,那么可以构成回文串,返回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)
-

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

被折叠的 条评论
为什么被折叠?



