You are given a 0-indexed string s having an even length n.
You are also given a 0-indexed 2D integer array, queries, where queries[i] = [ai, bi, ci, di].
For each query i, you are allowed to perform the following operations:
Rearrange the characters within the substrings[ai:bi], where 0 <= ai <= bi < n / 2.
Rearrange the characters within the substrings[ci:di], where n / 2 <= ci <= di < n.
For each query, your task is to determine whether it is possible to make s a palindrome by performing the operations.
Each query is answered independently of the others.
Return a 0-indexed array answer, where answer[i] == true if it is possible to make s a palindrome by performing operations specified by the ith query, and false otherwise.
A substring is a contiguous sequence of characters within a string.
s[x:y] represents the substring consisting of characters from the index x to index y in s, both inclusive.
Example 1:
Input: s = "abcabc", queries = [[1,1,3,5],[0,2,5,5]]
Output: [true,true]
Explanation: In this example, there are two queries:
In the first query:
- a0 = 1, b0 = 1, c0 = 3, d0 = 5.
- So, you are allowed to rearrange s[1:1] => abcabc and s[3:5] => abcabc.
- To make s a palindrome, s[3:5] can be rearranged to become => abccba.
- Now, s is a palindrome. So, answer[0] = true.
In the second query:
- a1 = 0, b1 = 2, c1 = 5, d1 = 5.
- So, you are allowed to rearrange s[0:2] => abcabc and s[5:5] => abcabc.
- To make s a palindrome, s[0:2] can be rearranged to become => cbaabc.
- Now, s is a palindrome. So, answer[1] = true.
Example 2:
Input: s = "abbcdecbba", queries = [[0,2,7,9]]
Output: [false]
Explanation: In this example, there is only one query.
a0 = 0, b0 = 2, c0 = 7, d0 = 9.
So, you are allowed to rearrange s[0:2] => abbcdecbba and s[7:9] => abbcdecbba.
It is not possible to make s a palindrome by rearranging these substrings because s[3:6] is not a palindrome.
So, answer[0] = false.
Example 3:
Input: s = "acbcab", queries = [[1,2,4,5]]
Output: [true]
Explanation: In this example, there is only one query.
a0 = 1, b0 = 2, c0 = 4, d0 = 5.
So, you are allowed to rearrange s[1:2] => acbcab and s[4:5] => acbcab.
To make s a palindrome s[1:2] can be rearranged to become abccab.
Then, s[4:5] can be rearranged to become abccba.
Now, s is a palindrome. So, answer[0] = true.
Constraints:
2 <= n == s.length <= 105
1 <= queries.length <= 105
queries[i].length == 4
ai == queries[i][0], bi == queries[i][1]
ci == queries[i][2], di == queries[i][3]
0 <= ai <= bi < n / 2
n / 2 <= ci <= di < n
n is even.
s consists of only lowercase English letters.
Solutions
Solution 1: Prefix Sum + Case Discussion
Let's denote the length of string \(s\) as \(n\), then half of the length is \(m = \frac{n}{2}\). Next, we divide string \(s\) into two equal-length segments, where the second segment is reversed to get string \(t\), and the first segment remains as \(s\). For each query \([a_i, b_i, c_i, d_i]\), where \(c_i\) and \(d_i\) need to be transformed to \(n - 1 - d_i\) and \(n - 1 - c_i\). The problem is transformed into: for each query \([a_i, b_i, c_i, d_i]\), determine whether \(s[a_i, b_i]\) and \(t[c_i, d_i]\) can be rearranged to make strings \(s\) and \(t\) equal.
We preprocess the following information:
The prefix sum array \(pre_1\) of string \(s\), where \(pre_1[i][j]\) represents the quantity of character \(j\) in the first \(i\) characters of string \(s\);
The prefix sum array \(pre_2\) of string \(t\), where \(pre_2[i][j]\) represents the quantity of character \(j\) in the first \(i\) characters of string \(t\);
The difference array \(diff\) of strings \(s\) and \(t\), where \(diff[i]\) represents the quantity of different characters in the first \(i\) characters of strings \(s\) and \(t\).
For each query \([a_i, b_i, c_i, d_i]\), let's assume \(a_i \le c_i\), then we need to discuss the following cases:
The prefix substrings \(s[..a_i-1]\) and \(t[..a_i-1]\) of strings \(s\) and \(t\) must be equal, and the suffix substrings \(s[\max(b_i, d_i)+1..]\) and \(t[\max(b_i, d_i)..]\) must also be equal, otherwise, it is impossible to rearrange to make strings \(s\) and \(t\) equal;
If \(d_i \le b_i\), it means the interval \([a_i, b_i]\) contains the interval \([c_i, d_i]\). If the substrings \(s[a_i, b_i]\) and \(t[a_i, b_i]\) contain the same quantity of characters, then it is possible to rearrange to make strings \(s\) and \(t\) equal, otherwise, it is impossible;
If \(b_i < c_i\), it means the intervals \([a_i, b_i]\) and \([c_i, d_i]\) do not intersect. Then the substrings \(s[b_i+1, c_i-1]\) and \(t[b_i+1, c_i-1]\) must be equal, and the substrings \(s[a_i, b_i]\) and \(t[a_i, b_i]\) must be equal, and the substrings \(s[c_i, d_i]\) and \(t[c_i, d_i]\) must be equal, otherwise, it is impossible to rearrange to make strings \(s\) and \(t\) equal.
If \(c_i \le b_i < d_i\), it means the intervals \([a_i, b_i]\) and \([c_i, d_i]\) intersect. Then the characters contained in \(s[a_i, b_i]\), minus the characters contained in \(t[a_i, c_i-1]\), must be equal to the characters contained in \(t[c_i, d_i]\), minus the characters contained in \(s[b_i+1, d_i]\), otherwise, it is impossible to rearrange to make strings \(s\) and \(t\) equal.
Based on the above analysis, we iterate through each query \([a_i, b_i, c_i, d_i]\), and determine whether it satisfies the above conditions.
The time complexity is \(O((n + q) \times |\Sigma|)\), and the space complexity is \(O(n \times |\Sigma|)\). Where \(n\) and \(q\) are the lengths of string \(s\) and the query array \(queries\) respectively; and \(|\Sigma|\) is the size of the character set. In this problem, the character set is lowercase English letters, so \(|\Sigma| = 26\).