Lint Code 1365. Minimum Cycle Section

Posted k330

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lint Code 1365. Minimum Cycle Section相关的知识,希望对你有一定的参考价值。

这题可以看作POJ 1961 最小循环节的一个简化版本。某补习班广告贴里给出的两个指针的参考解法简直大误。

受POJ 1961的启发,把数组看作字串,观察可知,如果字串全部由循环节构成(包括最后一段是不完整循环节的情况),则字串刨去最后一个字符的最长匹配前缀为最小循环节。而“最后一个字符的最长匹配前缀”即为KPM里的pattern[length -1]。所以我们只需按标准KMP算法求一遍失配函数即可。

    int minimumCycleSection(vector<int> &a) {
        size_t len = a.size();
        if(len <= 1) return len;
        int pattern[len];
        memset(pattern, 0, len * 4);
        pattern[0] = -1;
        for(size_t i = 1; i < len; i++){
            int j = pattern[i-1]+1;
            while(a[i] != a[j] && j > 0){
                j = pattern[j-1] + 1;
            }
            pattern[i] = a[i] == a[j] ? j : -1;
        }
        return len - pattern[len-1] - 1;
    }

 

以上是关于Lint Code 1365. Minimum Cycle Section的主要内容,如果未能解决你的问题,请参考以下文章

VS Code:更改 Lint 波浪下划线的颜色

471. 最高频的K个单词

Lint Code——最多共线的点的个数

VS Code

算法1365. 有多少小于当前数字的数字(java / c / c++ / python / go / rust)

2021牛客暑期多校训练营3 C.Minimum grid 二分图最大匹配