1794. Count Pairs of Equal Substrings With Minimum Difference π ο
Descriptionο
You are given two strings firstString and secondString that are 0-indexed and consist only of lowercase English letters. Count the number of index quadruples (i,j,a,b) that satisfy the following conditions:
0 <= i <= j < firstString.length0 <= a <= b < secondString.length- The substring of
firstStringthat starts at theithcharacter and ends at thejthcharacter (inclusive) is equal to the substring ofsecondStringthat starts at theathcharacter and ends at thebthcharacter (inclusive). j - ais the minimum possible value among all quadruples that satisfy the previous conditions.
Return the number of such quadruples.
Example 1:
Input: firstString = "abcd", secondString = "bccda" Output: 1 Explanation: The quadruple (0,0,4,4) is the only one that satisfies all the conditions and minimizes j - a.
Example 2:
Input: firstString = "ab", secondString = "cd" Output: 0 Explanation: There are no quadruples satisfying all the conditions.
Constraints:
1 <= firstString.length, secondString.length <= 2 * 105- Both strings consist only of lowercase English letters.
Solutionsο
Solution 1: Greedy + Hash Tableο
The problem actually asks us to find a smallest index $i$ and a largest index $j$ such that $firstString[i]$ equals $secondString[j]$, and the value of $i - j$ is the smallest among all index pairs that meet the conditions.
Therefore, we first use a hash table $last$ to record the index of the last occurrence of each character in $secondString$. Then we traverse $firstString$. For each character $c$, if $c$ has appeared in $secondString$, we calculate $i - last[c]$. If the value of $i - last[c]$ is less than the current minimum value, we update the minimum value and set the answer to 1. If the value of $i - last[c]$ equals the current minimum value, we increment the answer by 1.
The time complexity is $O(m + n)$, and the space complexity is $O(C)$. Here, $m$ and $n$ are the lengths of $firstString$ and $secondString$ respectively, and $C$ is the size of the character set. In this problem, $C = 26$.
Python3ο
class Solution:
def countQuadruples(self, firstString: str, secondString: str) -> int:
last = {c: i for i, c in enumerate(secondString)}
ans, mi = 0, inf
for i, c in enumerate(firstString):
if c in last:
t = i - last[c]
if mi > t:
mi = t
ans = 1
elif mi == t:
ans += 1
return ans
Javaο
class Solution {
public int countQuadruples(String firstString, String secondString) {
int[] last = new int[26];
for (int i = 0; i < secondString.length(); ++i) {
last[secondString.charAt(i) - 'a'] = i + 1;
}
int ans = 0, mi = 1 << 30;
for (int i = 0; i < firstString.length(); ++i) {
int j = last[firstString.charAt(i) - 'a'];
if (j > 0) {
int t = i - j;
if (mi > t) {
mi = t;
ans = 1;
} else if (mi == t) {
++ans;
}
}
}
return ans;
}
}
C++ο
class Solution {
public:
int countQuadruples(string firstString, string secondString) {
int last[26] = {0};
for (int i = 0; i < secondString.size(); ++i) {
last[secondString[i] - 'a'] = i + 1;
}
int ans = 0, mi = 1 << 30;
for (int i = 0; i < firstString.size(); ++i) {
int j = last[firstString[i] - 'a'];
if (j) {
int t = i - j;
if (mi > t) {
mi = t;
ans = 1;
} else if (mi == t) {
++ans;
}
}
}
return ans;
}
};
Goο
func countQuadruples(firstString string, secondString string) (ans int) {
last := [26]int{}
for i, c := range secondString {
last[c-'a'] = i + 1
}
mi := 1 << 30
for i, c := range firstString {
j := last[c-'a']
if j > 0 {
t := i - j
if mi > t {
mi = t
ans = 1
} else if mi == t {
ans++
}
}
}
return
}
TypeScriptο
function countQuadruples(firstString: string, secondString: string): number {
const last: number[] = new Array(26).fill(0);
for (let i = 0; i < secondString.length; ++i) {
last[secondString.charCodeAt(i) - 97] = i + 1;
}
let [ans, mi] = [0, Infinity];
for (let i = 0; i < firstString.length; ++i) {
const j = last[firstString.charCodeAt(i) - 97];
if (j) {
const t = i - j;
if (mi > t) {
mi = t;
ans = 1;
} else if (mi === t) {
++ans;
}
}
}
return ans;
}