Welcome to Subscribe On Youtube
3694. Distinct Points Reachable After Substring Removal
Description
You are given a string s consisting of characters 'U', 'D', 'L', and 'R', representing moves on an infinite 2D Cartesian grid.
'U': Move from(x, y)to(x, y + 1).'D': Move from(x, y)to(x, y - 1).'L': Move from(x, y)to(x - 1, y).'R': Move from(x, y)to(x + 1, y).
You are also given a positive integer k.
You must choose and remove exactly one contiguous substring of length k from s. Then, start from coordinate (0, 0) and perform the remaining moves in order.
Return an integer denoting the number of distinct final coordinates reachable.
Example 1:
Input: s = "LUL", k = 1
Output: 2
Explanation:
After removing a substring of length 1, s can be "UL", "LL" or "LU". Following these moves, the final coordinates will be (-1, 1), (-2, 0) and (-1, 1) respectively. There are two distinct points (-1, 1) and (-2, 0) so the answer is 2.
Example 2:
Input: s = "UDLR", k = 4
Output: 1
Explanation:
After removing a substring of length 4, s can only be the empty string. The final coordinates will be (0, 0). There is only one distinct point (0, 0) so the answer is 1.
Example 3:
Input: s = "UU", k = 1
Output: 1
Explanation:
After removing a substring of length 1, s becomes "U", which always ends at (0, 1), so there is only one distinct final coordinate.
Constraints:
1 <= s.length <= 105sconsists of only'U','D','L', and'R'.1 <= k <= s.length
Solutions
Solution 1
-
class Solution { public int distinctPoints(String s, int k) { int n = s.length(); int[] f = new int[n + 1]; int[] g = new int[n + 1]; int x = 0, y = 0; for (int i = 1; i <= n; ++i) { char c = s.charAt(i - 1); if (c == 'U') { ++y; } else if (c == 'D') { --y; } else if (c == 'L') { --x; } else { ++x; } f[i] = x; g[i] = y; } Set<Long> st = new HashSet<>(); for (int i = k; i <= n; ++i) { int a = f[n] - (f[i] - f[i - k]); int b = g[n] - (g[i] - g[i - k]); st.add(1L * a * n + b); } return st.size(); } } -
class Solution { public: int distinctPoints(string s, int k) { int n = s.size(); vector<int> f(n + 1), g(n + 1); int x = 0, y = 0; for (int i = 1; i <= n; ++i) { char c = s[i - 1]; if (c == 'U') ++y; else if (c == 'D') --y; else if (c == 'L') --x; else ++x; f[i] = x; g[i] = y; } unordered_set<long long> st; for (int i = k; i <= n; ++i) { int a = f[n] - (f[i] - f[i - k]); int b = g[n] - (g[i] - g[i - k]); st.insert(1LL * a * n + b); } return st.size(); } }; -
class Solution: def distinctPoints(self, s: str, k: int) -> int: n = len(s) f = [0] * (n + 1) g = [0] * (n + 1) x = y = 0 for i, c in enumerate(s, 1): if c == "U": y += 1 elif c == "D": y -= 1 elif c == "L": x -= 1 else: x += 1 f[i] = x g[i] = y st = set() for i in range(k, n + 1): a = f[n] - (f[i] - f[i - k]) b = g[n] - (g[i] - g[i - k]) st.add((a, b)) return len(st) -
func distinctPoints(s string, k int) int { n := len(s) f := make([]int, n+1) g := make([]int, n+1) x, y := 0, 0 for i := 1; i <= n; i++ { c := s[i-1] if c == 'U' { y++ } else if c == 'D' { y-- } else if c == 'L' { x-- } else { x++ } f[i] = x g[i] = y } st := make(map[int64]struct{}) for i := k; i <= n; i++ { a := f[n] - (f[i] - f[i-k]) b := g[n] - (g[i] - g[i-k]) key := int64(a)*int64(n) + int64(b) st[key] = struct{}{} } return len(st) } -
function distinctPoints(s: string, k: number): number { const n = s.length; const f = new Array(n + 1).fill(0); const g = new Array(n + 1).fill(0); let x = 0, y = 0; for (let i = 1; i <= n; ++i) { const c = s[i - 1]; if (c === 'U') ++y; else if (c === 'D') --y; else if (c === 'L') --x; else ++x; f[i] = x; g[i] = y; } const st = new Set<number>(); for (let i = k; i <= n; ++i) { const a = f[n] - (f[i] - f[i - k]); const b = g[n] - (g[i] - g[i - k]); st.add(a * n + b); } return st.size; } -
use std::collections::HashSet; impl Solution { pub fn distinct_points(s: String, k: i32) -> i32 { let n = s.len(); let mut f = vec![0; n + 1]; let mut g = vec![0; n + 1]; let mut x = 0; let mut y = 0; let bytes = s.as_bytes(); for i in 1..=n { match bytes[i - 1] as char { 'U' => y += 1, 'D' => y -= 1, 'L' => x -= 1, _ => x += 1, } f[i] = x; g[i] = y; } let mut st = HashSet::new(); let k = k as usize; for i in k..=n { let a = f[n] - (f[i] - f[i - k]); let b = g[n] - (g[i] - g[i - k]); st.insert((a as i64) * (n as i64) + (b as i64)); } st.len() as i32 } }