LeetCode:Repeated Substring Pattern(重复的子字符串)

题目

Given a non-empty string check if it can be constructed by taking a substring of it and appending multiple copies of the substring together. You may assume the given string consists of lowercase English letters only and its length will not exceed 10000.

Example1 :

Input: "abab"

Output: True

Explanation: It's the substring "ab" twice.

Example 2:

Input: "aba"

Output: False

Example 3:

Input: "abcabcabcabc"

Output: True

Explanation: It's the substring "abc" four times. (And the substring "abcabc" twice.)

思路

该题考察的是字符串匹配。

首先考虑可能的构造子串长度,为了反复多个构成父串,父串的长度一定能整除构造子串长度,且构造子串长度一定小于父串长度。这样可以减少大量循环次数。

然后按一种构造子串长度,判断父串中对应位置的字符是否相同,如果不相同,对下一种长度进行搜索;如果对应位置都相等则返回true。

下面以一个例子解释代码思路:
假设输入s=abababab,长度为8,可能构造子串长度为1,2,4。
1.对长度为1的构造子串进行搜索。s[0]和s[1]不相等,直接跳出,进行下一个构造子串搜索。
2.对长度为2的构造子串进行搜索。s[0]和s[2]相等,判断下一个对应位置;s[1]和s[3]相等,判断下一个对应位置;s[2]和s[4]相等,判断下一个对应位置;s[3]和s[5]相等,判断下一个对应位置;s[4]和s[6]相等,判断下一个对应位置;s[5]和s[7]相等,结束循环,找到了构造子串,返回true。

代码

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n=s.size();
        if(n<2)
            return false;

        for(int i=1;iint flag=0;
            if(n%i!=0)
                continue;
            for(int j=0;jif(s[j]!=s[j+i])
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0)
                return true;
        }
        return false;
    }
};

你可能感兴趣的:(刷题,刷题笔记)