Welcome to Subscribe On Youtube
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.length
0 <= a <= b < secondString.length
- The substring of
firstString
that starts at theith
character and ends at thejth
character (inclusive) is equal to the substring ofsecondString
that starts at theath
character and ends at thebth
character (inclusive). j - a
is 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
Therefore, we first use a hash table
The time complexity is
-
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; } }
-
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; } };
-
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
-
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 }
-
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; }