双倍字符串法
LeetCode 459
https://leetcode-cn.com/problems/repeated-substring-pattern/
解题思路
如题,可以将字符串放大一倍,然后去掉字符串开头,即从头开始遍历去找原字符串s,如果在s.length()之前找到,说明符合题意,在s.length()位置还没找到,则不符合。
理由:双倍字符串ss,后半截s必然等于前半截s,我们从下标1 位置开始遍历寻找s,如果到后半截s位置即s.length(),还没找到,则说明前半截s不符合题意。
双倍字符串原因:
1.双倍字符串,并从1开始查找,相当于把s前缀挪到后面去,作为原s的一个补充,让后面的字符串够长。利用indexOf()可以找到匹配字符串的起始位置。
2.作为前半截没有找到s的结束标志。前半截没找到,最终肯定会落到后半截s开头位置,此时就说明前半截即原字符串不符合,所以可以直接返回false。
代码如下:
class Solution {
public boolean repeatedSubstringPattern(String s) {
return (s + s).indexOf(s, 1) != s.length();
}
}
网友评论