有關字串元素統計型別題目的一點感想

unspoken0714發表於2020-12-05

在刷leetcode時,常常會發現需要將字串中的char統計出現的頻率。其實這時我們可以構建一個陣列儲存字元出現的頻率。

string s;
vector<int> con(26,0);
for(char e:s){
	con[e-'a']++;
}

例子

621. 任務排程器

給你一個用字元陣列 tasks 表示的 CPU 需要執行的任務列表。其中每個字母表示一種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。在任何一個單位時間,CPU 可以完成一個任務,或者處於待命狀態。
然而,兩個 相同種類 的任務之間必須有長度為整數 n 的冷卻時間,因此至少有連續 n 個單位時間內 CPU 在執行不同的任務,或者在待命狀態。
你需要計算完成所有任務所需要的 最短時間 。

輸入:tasks = [“A”,“A”,“A”,“B”,“B”,“B”], n = 2
輸出:8
解釋:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
在本示例中,兩個相同型別任務之間必須間隔長度為 n = 2 的冷卻時間,而執行一個任務只需要一個單位時間,所以中間出現了(待命)狀態。

輸入:tasks = [“A”,“A”,“A”,“B”,“B”,“B”], n = 0
輸出:6
解釋:在這種情況下,任何大小為 6 的排列都可以滿足要求,因為 n = 0
[“A”,“A”,“A”,“B”,“B”,“B”]
[“A”,“B”,“A”,“B”,“A”,“B”]
[“B”,“B”,“B”,“A”,“A”,“A”]

諸如此類

輸入:tasks = [“A”,“A”,“A”,“A”,“A”,“A”,“B”,“C”,“D”,“E”,“F”,“G”], n = 2
輸出:16
解釋:一種可能的解決方案是:
A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A

思路:
因為連續執行相同命令時,需要冷卻n時間,所以我們這時可以採取貪心的策略

  • 相同元素間隔n個元素,首先保證出現最多頻率的元素滿足這一要求
  • 在對其他元素進行在該間隔中插值

|A X X |A X X| A
根據上述桶所示可以退出最少需要(numOf(A) - 1)*n +1

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        vector<int> con(26,0);
        for(char e: tasks){
            con[e-'A']++;
        }

        int count = 1;
        int i = 0;
        sort(con.rbegin(),con.rend());
        while(i+1<=con.size()-1&&con[i] == con[i+1]){
            i++;
            count++;
        }
        int result = (con[0]-1)*(n+1) + count;
        if(result<tasks.size()){
            return tasks.size();
        }else{
            return result;
        }
    }
};

相關文章