Contents

ARST打卡第245周

lc2182_构造限制重复的字符串 TED_关注自己心理健康 用微信读书读英文电子书 荐书_悉达多

Algorithm

lc2182_构造限制重复的字符串

思路: 先遍历获取cnt字符数组,然后从尾到头构造,每次到最大重复次数的时候吃一个下一个字符。 没有字符cnt的时候,就直接进行下一个字符的输出。

这个示例2是一个难点,一定要想清楚怎么处理结尾终止,否则很容易导致反复修改导致无法30分钟内写完。 汗,我就一开始没想清楚,导致中等简单题写了50分钟

通过每次遍历一遍 cnt 数组,数组中如果有字符大于 repeatLimit, 说明后续还得再进入 for 来判定。 非连续的部分直接一直遍历即可,不用计数。

再次进入时判断吃一个的逻辑和是否不用再重复的逻辑。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Solution {
public:
    string repeatLimitedString(string s, int repeatLimit) {
        vector<int> cnt(27, 0);
        for (auto c : s) {
            cnt[c - 'a']++;
        }

        bool bigerLeft = true;
        string ans;
        while (bigerLeft) {
            // assum bigerLeft false firstly
            bigerLeft = false;
            for (int i = 26; i >= 0; i--) {
                if (!cnt[i]) {
                    continue;
                }
                // follow logic will eat char ok, so again `for`
                // need to check back char is same or not.
                if (!ans.empty() && ans.back() == 'a' + i) {
                    break;
                }
                if (bigerLeft) {
                    ans += 'a' + i;
                    cnt[i]--;
                    break;    
                }
                if (cnt[i] > repeatLimit) {
                    // 这里大于的话,说明后续还要进入一次for循环
                    // 但是当前for需要继续下去 **1个字符**
                    ans += string(repeatLimit, 'a' + i);
                    cnt[i] -= repeatLimit;
                    bigerLeft = true;
                } else {
                    ans += string(cnt[i], 'a' + i);
                    cnt[i] = 0;
                }
            }
        }
        return ans;
    }
};

题解的双指针方式其实和我的思路差不多,我相当于是用循环代替了双指针,题解更具有通用性,建议学一下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const int N = 26;
class Solution {
public:
    string repeatLimitedString(string s, int repeatLimit) {
        vector<int> count(N);
        for (char c : s) {
            count[c - 'a']++;
        }
        string ret;
        int m = 0;
        for (int i = N - 1, j = N - 2; i >= 0 && j >= 0;) {
            if (count[i] == 0) { // 当前字符已经填完,填入后面的字符,重置 m
                m = 0;
                i--;
            } else if (m < repeatLimit) { // 当前字符未超过限制
                count[i]--;
                ret.push_back('a' + i);
                m++;
            } else if (j >= i || count[j] == 0) { // 当前字符已经超过限制,查找可填入的其他字符
                j--;
            } else { // 当前字符已经超过限制,填入其他字符,并且重置 m
                count[j]--;
                ret.push_back('a' + j);
                m = 0;
            }
        }
        return ret;
    }
};

Review

TED: 关注自己心理健康

  • 像关注身体健康一样得关注心理健康
  • 向前看,当经历心理痛苦的时候,去接纳并不再需要,向前看,千万不要回想"打翻的牛奶",否则会让你抑郁,而是做专注其他事情
  • 积极的心理暗示,相信自己一定能变得更好,而不是更加糟糕。相信自己很好。

Tips

用微信读书读英文电子书。

自己英文水平一般,直接读全英文的话,还是有些吃力的,然后最近把英文电子书导入微信读书阅读。

发现有自动的翻译,每一段都会翻译,这样就能先读英文,实在读不懂就能直接看翻译,不用每次都 复制粘贴到翻译工具,然后重新再理解一整个流程拖慢阅读速度了。

Share

推荐书本: 悉达多

https://cdn.jsdelivr.net/gh/wolfdan666/BlogPic/books/xidaduo.jpg