zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    列表方块与格式与布局
    框架与样式表的基本概念
    表单
    内容容器,常用标签
    CSS3
    表单验证
    练习题
    document对象
    windows对象
    函数
  • 原文地址:https://www.cnblogs.com/k330/p/LintCode1365_Minimum_Cycle_Section.html
Copyright © 2011-2022 走看看