Welcome to Subscribe On Youtube
1525. Number of Good Ways to Split a String
Description
You are given a string s
.
A split is called good if you can split s
into two non-empty strings sleft
and sright
where their concatenation is equal to s
(i.e., sleft + sright = s
) and the number of distinct letters in sleft
and sright
is the same.
Return the number of good splits you can make in s
.
Example 1:
Input: s = "aacaba"
Output: 2
Explanation: There are 5 ways to split "aacaba"
and 2 of them are good.
("a", "acaba") Left string and right string contains 1 and 3 different letters respectively.
("aa", "caba") Left string and right string contains 1 and 3 different letters respectively.
("aac", "aba") Left string and right string contains 2 and 2 different letters respectively (good split).
("aaca", "ba") Left string and right string contains 2 and 2 different letters respectively (good split).
("aacab", "a") Left string and right string contains 3 and 1 different letters respectively.
Example 2:
Input: s = "abcd" Output: 1 Explanation: Split the string as follows ("ab", "cd").
Constraints:
1 <= s.length <= 105
s
consists of only lowercase English letters.
Solutions
-
class Solution { public int numSplits(String s) { Map<Character, Integer> cnt = new HashMap<>(); for (char c : s.toCharArray()) { cnt.merge(c, 1, Integer::sum); } Set<Character> vis = new HashSet<>(); int ans = 0; for (char c : s.toCharArray()) { vis.add(c); if (cnt.merge(c, -1, Integer::sum) == 0) { cnt.remove(c); } if (vis.size() == cnt.size()) { ++ans; } } return ans; } }
-
class Solution { public: int numSplits(string s) { unordered_map<char, int> cnt; for (char& c : s) { ++cnt[c]; } unordered_set<char> vis; int ans = 0; for (char& c : s) { vis.insert(c); if (--cnt[c] == 0) { cnt.erase(c); } ans += vis.size() == cnt.size(); } return ans; } };
-
class Solution: def numSplits(self, s: str) -> int: cnt = Counter(s) vis = set() ans = 0 for c in s: vis.add(c) cnt[c] -= 1 if cnt[c] == 0: cnt.pop(c) ans += len(vis) == len(cnt) return ans
-
func numSplits(s string) (ans int) { cnt := map[rune]int{} for _, c := range s { cnt[c]++ } vis := map[rune]bool{} for _, c := range s { vis[c] = true cnt[c]-- if cnt[c] == 0 { delete(cnt, c) } if len(vis) == len(cnt) { ans++ } } return }