第30天,一个月了。
今天的题目是Partition Labels:
这道题的解法如下:
先遍历一次字符串统计字符出现的次数保存在c1
上,然后在遍历一次字符串,这次遍历时同样进行统计字符出现次数保存在c2
上,并维护一个变量cnum
,这个变量cnum
表示当前出现过但是未出现完全的字符的种类数。当出现cnum
为 0 时,就表示完成了一次划分。代码如下:
1vector<int> partitionLabels(string S) {2 vector<int> c1(26, 0);3 for(int i = 0, size = S.size(); i < size; i++) {4 c1[S[i] - 'a']++;5 }6
7 vector<int> c2(26, 0);8 vector<int> res;9 int temp = 1, cnum = 0;10
11 for(int i = 0, size = S.size(); i < size; i++, temp++) {12 int index = S[i] - 'a';13 if (c2[index] == 0) {14 cnum++;15 }6 collapsed lines
16 if (++c2[index]== c1[index] && --cnum == 0) {17 res.push_back(temp); temp = 0;18 }19 }20 return res;21}