1. 程式人生 > 其它 >牛客巔峰賽S2鑽石&王者場B題-牛牛與字串2

牛客巔峰賽S2鑽石&王者場B題-牛牛與字串2

技術標籤:C/C++KMP字串指標演算法

連結:https://ac.nowcoder.com/acm/contest/9887/B
來源:牛客網

牛牛拿到了一個字串。他想知道除去字串本身以外,這個字串最大的公共前後綴的長度是多少?

例如,對於字串ABABA而言,“ABA”即是它的字首,也是它的字尾,且是最長的公共前後綴,因此最大的長度是3。

牛牛無法解決該問題,所以他只好向你求助,給定一個只包含大寫字母的字串s,返回除去字串本身以外公共前後綴最大長度,如果沒有任何一個公共前後綴滿足要求,返回-1即可。

1≤∣s∣≤106,且字串中只包含大寫字母

思路:

類似於KMP演算法,用一個指標維持字首,另外一個指標掃描字串

class Solution {
public:
    /**
     * 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
     * 給定一個字串s,返回具有相同字首字尾的子串的第二大長度,反之,返回-1即可。
     * @param s string字串 代表題意中的字串s
     * @return int整型
     */
    int solve(string s) {
        // write code here
        int index = 0;//指標初始指向第一位
        for(int i = 1;i < s.length(); ++i){//從第二位開始比較
            if(s[i] == s[index])//當前和指標指向相等,指標繼續向下走
                ++index;
            else{
                if(s[i] == s[0])//當前和第一個相等,指向回到第二個
                    index = 1;
                else //當前和第一個都不相等,指標回到第一個
                    index = 0;
            }
        }
        if(index == 0)//遍歷到最後指標還在第一個位置,說明沒有最長
            return -1;
        return index;//指標左部分為最大長度
    }
};