题目描述:
给出两个长度为 n 的字符串。选择一个下标,将两个字符串在这个位置分割开,得到 aprefix 和 asuffix ,以及 bprefix 和 bsubfix 。判断 aprefix+bsubfix 或 bprefix+asubfix 能否构成回文串。注意空字符串也是合法分割。
数据范围:
1≤n≤105
题解:
首先写一个检测字符串 [left,right] 是否是回文串的函数。同时 aprefix+bsubfix 或 bprefix+asubfix 也是两个相同的问题,只需要判断一个,然后交换 a 和 b 再调用一次。
首先使用双指针 left,right 判断 a[left] 的前缀和 b[right] 的后缀是否相等,不相等时,判断 a[left,right],b[left,right] 是否是回文串即可。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: const static int maxn = 1e5 + 10; const static int maxm = 1e5 + 10; const static int INF = 0x3f3f3f3f; bool isPalindrome(string &s, int left, int right) { while (left < right) { if (s[left] != s[right]) { return false; } left++; right--; } return true; } bool check(string &a, string &b) { int left = 0, right = b.size() - 1; while (left < right && a[left] == b[right]) { left++; right--; } if (left == right) return true; if (isPalindrome(b, left, right) || isPalindrome(a, left, right)) { return true; } return false; } bool checkPalindromeFormation(string a, string b) { return check(a, b) || check(b, a); } };
|
v1.5.1