Medium
You are given a binary string s, and a 2D integer array queries where queries[i] = [firsti, secondi].
For the ith query, find the shortest substring of s whose decimal value, val, yields secondi when bitwise XORed with firsti. In other words, val ^ firsti == secondi.
The answer to the ith query is the endpoints (0-indexed) of the substring [lefti, righti] or [-1, -1] if no such substring exists. If there are multiple answers, choose the one with the minimum lefti.
Return an array ans where ans[i] = [lefti, righti] is the answer to the ith query.
A substring is a contiguous non-empty sequence of characters within a string.
Example 1:
Input: s = “101101”, queries = [[0,5],[1,2]]
Output: [[0,2],[2,3]]
Explanation: For the first query the substring in range [0,2] is “101” which has a decimal value of 5, and 5 ^ 0 = 5, hence the answer to the first query is [0,2]. In the second query, the substring in range [2,3] is “11”, and has a decimal value of 3, and 3 ^ 1 = 2. So, [2,3] is returned for the second query.
Example 2:
Input: s = “0101”, queries = [[12,8]]
Output: [[-1,-1]]
Explanation: In this example there is no substring that answers the query, hence [-1,-1] is returned.
Example 3:
Input: s = “1”, queries = [[4,5]]
Output: [[0,0]]
Explanation: For this example, the substring in range [0,0] has a decimal value of 1, and 1 ^ 4 = 5. So, the answer is [0,0].
Constraints:
1 <= s.length <= 104s[i] is either '0' or '1'.1 <= queries.length <= 1050 <= firsti, secondi <= 109import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[][] substringXorQueries(String s, int[][] queries) {
int[][] ans = new int[queries.length][2];
Map<Integer, int[]> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '0') {
map.putIfAbsent(0, new int[] {i, i});
continue;
}
int value = 0;
for (int j = i; j <= Math.min(i + 30, s.length() - 1); j++) {
value = (value << 1) + (s.charAt(j) - '0');
map.putIfAbsent(value, new int[] {i, j});
}
}
int i = 0;
for (int[] q : queries) {
ans[i++] = map.getOrDefault(q[0] ^ q[1], new int[] {-1, -1});
}
return ans;
}
}