Welcome to Subscribe On Youtube
2767. Partition String Into Minimum Beautiful Substrings
Description
Given a binary string s
, partition the string into one or more substrings such that each substring is beautiful.
A string is beautiful if:
- It doesn't contain leading zeros.
- It's the binary representation of a number that is a power of
5
.
Return the minimum number of substrings in such partition. If it is impossible to partition the string s
into beautiful substrings, return -1
.
A substring is a contiguous sequence of characters in a string.
Example 1:
Input: s = "1011" Output: 2 Explanation: We can paritition the given string into ["101", "1"]. - The string "101" does not contain leading zeros and is the binary representation of integer 51 = 5. - The string "1" does not contain leading zeros and is the binary representation of integer 50 = 1. It can be shown that 2 is the minimum number of beautiful substrings that s can be partitioned into.
Example 2:
Input: s = "111" Output: 3 Explanation: We can paritition the given string into ["1", "1", "1"]. - The string "1" does not contain leading zeros and is the binary representation of integer 50 = 1. It can be shown that 3 is the minimum number of beautiful substrings that s can be partitioned into.
Example 3:
Input: s = "0" Output: -1 Explanation: We can not partition the given string into beautiful substrings.
Constraints:
1 <= s.length <= 15
s[i]
is either'0'
or'1'
.
Solutions
-
class Solution { private Integer[] f; private String s; private Set<Long> ss = new HashSet<>(); private int n; public int minimumBeautifulSubstrings(String s) { n = s.length(); this.s = s; f = new Integer[n]; long x = 1; for (int i = 0; i <= n; ++i) { ss.add(x); x *= 5; } int ans = dfs(0); return ans > n ? -1 : ans; } private int dfs(int i) { if (i >= n) { return 0; } if (s.charAt(i) == '0') { return n + 1; } if (f[i] != null) { return f[i]; } long x = 0; int ans = n + 1; for (int j = i; j < n; ++j) { x = x << 1 | (s.charAt(j) - '0'); if (ss.contains(x)) { ans = Math.min(ans, 1 + dfs(j + 1)); } } return f[i] = ans; } }
-
class Solution { public: int minimumBeautifulSubstrings(string s) { unordered_set<long long> ss; int n = s.size(); long long x = 1; for (int i = 0; i <= n; ++i) { ss.insert(x); x *= 5; } int f[n]; memset(f, -1, sizeof(f)); function<int(int)> dfs = [&](int i) { if (i >= n) { return 0; } if (s[i] == '0') { return n + 1; } if (f[i] != -1) { return f[i]; } long long x = 0; int ans = n + 1; for (int j = i; j < n; ++j) { x = x << 1 | (s[j] - '0'); if (ss.count(x)) { ans = min(ans, 1 + dfs(j + 1)); } } return f[i] = ans; }; int ans = dfs(0); return ans > n ? -1 : ans; } };
-
class Solution: def minimumBeautifulSubstrings(self, s: str) -> int: @cache def dfs(i: int) -> int: if i >= n: return 0 if s[i] == "0": return inf x = 0 ans = inf for j in range(i, n): x = x << 1 | int(s[j]) if x in ss: ans = min(ans, 1 + dfs(j + 1)) return ans n = len(s) x = 1 ss = {x} for i in range(n): x *= 5 ss.add(x) ans = dfs(0) return -1 if ans == inf else ans
-
func minimumBeautifulSubstrings(s string) int { ss := map[int]bool{} n := len(s) x := 1 f := make([]int, n+1) for i := 0; i <= n; i++ { ss[x] = true x *= 5 f[i] = -1 } var dfs func(int) int dfs = func(i int) int { if i >= n { return 0 } if s[i] == '0' { return n + 1 } if f[i] != -1 { return f[i] } f[i] = n + 1 x := 0 for j := i; j < n; j++ { x = x<<1 | int(s[j]-'0') if ss[x] { f[i] = min(f[i], 1+dfs(j+1)) } } return f[i] } ans := dfs(0) if ans > n { return -1 } return ans } func min(a, b int) int { if a < b { return a } return b }
-
function minimumBeautifulSubstrings(s: string): number { const ss: Set<number> = new Set(); const n = s.length; const f: number[] = new Array(n).fill(-1); for (let i = 0, x = 1; i <= n; ++i) { ss.add(x); x *= 5; } const dfs = (i: number): number => { if (i === n) { return 0; } if (s[i] === '0') { return n + 1; } if (f[i] !== -1) { return f[i]; } f[i] = n + 1; for (let j = i, x = 0; j < n; ++j) { x = (x << 1) | (s[j] === '1' ? 1 : 0); if (ss.has(x)) { f[i] = Math.min(f[i], 1 + dfs(j + 1)); } } return f[i]; }; const ans = dfs(0); return ans > n ? -1 : ans; }