1. 程式人生 > 實用技巧 >5458. 字串的好分割數目. 字首和

5458. 字串的好分割數目. 字首和

給你一個字串 s ,一個分割被稱為 「好分割」 當它滿足:將 s 分割成 2 個字串 p 和 q ,它們連線起來等於 s 且 p 和 q 中不同字元的數目相同。

請你返回 s 中好分割的數目。

示例 1:

輸入:s = "aacaba"
輸出:2
解釋:總共有 5 種分割字串 "aacaba" 的方法,其中 2 種是好分割。
("a", "acaba") 左邊字串和右邊字串分別包含 1 個和 3 個不同的字元。
("aa", "caba") 左邊字串和右邊字串分別包含 1 個和 3 個不同的字元。
("aac", "aba") 左邊字串和右邊字串分別包含 2 個和 2 個不同的字元。這是一個好分割。
("aaca", "ba") 左邊字串和右邊字串分別包含 2 個和 2 個不同的字元。這是一個好分割。
("aacab", "a") 左邊字串和右邊字串分別包含 3 個和 1 個不同的字元。
示例 2:

輸入:s = "abcd"
輸出:1
解釋:好分割為將字串分割成 ("ab", "cd") 。
示例 3:

輸入:s = "aaaaa"
輸出:4
解釋:所有分割都是好分割。
示例 4:

輸入:s = "acbadbaada"
輸出:2

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/number-of-good-ways-to-split-a-string
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

用兩個map統計字首和字尾和,同時應用map.erase和map.size()實時更新map中的資料

class Solution {
public:
    int numSplits(string s) {
        map <char, int> l, r;
        for (char ch : s) {
            ++r[ch];
        }
        int ans = 0;
        for (char ch : s) {
            ++l[ch];
            --r[ch];
            if (r[ch] == 0) r.erase(ch);
            if (l.size() == r.size()) ans++;
        }
        return ans;
    }
};