459. Repeated Substring Pattern

459. Repeated Substring Pattern

题目链接:https://leetcode.com/problems...

利用kmp求prefix数组的方法来做,利用string自身的重复性,prefix[i] = k, k < i表示在s[0, i+1]中,最大的k使得s[0, k] == s[i-k+1, i+1]
参考视频:
https://www.youtube.com/watch...

所以如果这个string是呈现repeated substring pattern的样子的话,假设repeat的大小是m,则prefix[0] = prefix[1] = ... = prefix[m-1] = 0 并且prefix[n-1] = prefix[n-2] + 1 =... = prefix[m] + n-m-1 = n - m
根据n % m == 0可知:n%(n - prefix[n-1]) == 0,一旦中间出现不满足pattern的情况,prefix[n-1] < n / 2,所以n-prefix[n-1] > n / 2必然不是n的divisor,如果结尾处少了的话,例如abcabca,虽然prefix[n-1] > n/2,但不满足divisor的条件。

public class Solution {
    public boolean repeatedSubstringPattern(String str) {
        int[] prefix = build(str);
        int n = str.length();
        return prefix[n-1] != 0 && n % (n - prefix[n-1]) == 0;
    }
    
    private int[] build(String s) {
        int n = s.length();
        int[] res = new int[n];
        int i = 1, j = 0;
        while(i < n) {
            // match, add the length
            if(s.charAt(i) == s.charAt(j)) {
                res[i] = j + 1;
                i++; j++;
            }
            // not match, return to previous
            else {
                if(j == 0) i++;
                else j = res[j-1];
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值