Try   HackMD

【LeetCode】 2405. Optimal Partition of String

Description

Given a string s, partition the string into one or more substrings such that the characters in each substring are unique. That is, no letter appears in a single substring more than once.
Return the minimum number of substrings in such a partition.
Note that each character should belong to exactly one substring in a partition.

Constraints:
1 <= s.length <= 105
s consists of only English lowercase letters.

給一字串 s,將該字串切割為一段或是多段的子字串,且每段子字串中的字母都得是唯一的。也就是說,任意一個子字串中,不會有字母出現超過一次。
回傳分割後子字串數量的最小值
注意,在一個合理的分割後每個字元都應該剛好屬於一個子字串

限制:
1 <= s.length <= 105
s 只會包含小寫的英文字母

Example:

Example 1:

Input: s = "abacaba"
Output: 4
Explanation:
Two possible partitions are ("a","ba","cab","a") and ("ab","a","ca","ba").
It can be shown that 4 is the minimum number of substrings needed.
Example 2:

Input: s = "ssssss"
Output: 6
Explanation:
The only valid partition is ("s","s","s","s","s","s").

Solution

  • 用貪婪演算法就可以解了
  • 從字串頭開始往後面遍歷,檢查該字元是否出現在子字串中
    • 如果沒有,將該字元加入子字串
    • 如果有,將子字串清空,答案數量加一(開始下一個子字串的概念)
  • 實作上為了加速,子字串的部分可用 hash map,加速搜尋字元是否出現過的部分

Code

class Solution { public: int partitionString(string s) { set<char> unique_char; int count = 0; for(int i = 0; i < s.length(); i++) { if(unique_char.count(s[i]) != 0) { count++; unique_char.clear(); } unique_char.insert(s[i]); } return count + 1; } };
tags: LeetCode C++