LeetCode字符串篇【459.重复的子字符串】

力扣题目链接(opens new window)

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。

示例 2:
输入: "aba"
输出: False

示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

正解

1)常规思路:若可以由字串组成,那么字串的长度一定为原字符长度的因数,在按照因数的大小将原字符进行划分,对获得的字串进行比较,若相同则存在;否则不存在

class Solution {
     public static boolean repeatedSubstringPattern(String s) {
        List list = getFactorsArrays(s.length());//获取因子
        if (list.size() == 0 ) return false;
        for (Integer o : list) {
            List list1 = getStrList(s, s.length() / o);
            if (compare(list1)) return true;//若存在返回true
        }
        return false;//若不存在返回false
    }

    //获取分割后的字串列表
    public static List getStrList(String inputString, int length) {
        List list = new ArrayList<>();
        for (int i = 0; i < inputString.length() / length; i++) {
            list.add(inputString.substring(i * length, i * length + length));
        }
        return list;
    }

    //字串进行比较
    static boolean compare(List str) {
        for (int i = 0; i < str.size(); i++) {
            if (!str.get(i).equals(str.get(0))) {
                return false;
            }
        }
        return true;
    }

    //获取原字符串长度的因子集合,这里主要要去掉1和本身
    static List getFactorsArrays(int n) {//获得因子数
        int count = 0;
        List list = new ArrayList();
        if (n == 0)
            return list;
        else {
            for (int i = 1; i <= Math.sqrt(n); i++) {
/*只用计算1到n的平方根之间的数,这是因为当我们得出n % i == 0时,同时确定了i和n/i两个因子,不用重复计算.
举个栗子:64的因子:1,2,4,8,16,32,64   64的平方根8相当于一个分界线的作用*/
                if (n % i == 0) {
                    if (i != n / i) {//考虑n=1的特殊情况
                        if(i!=1)list.add(i);
                        list.add(n / i);
                    } else {
                        if(i!=1)list.add(i);
                    }
                }
            }
            return list;
        }
    }
}

2)KMP思想

(尚未看懂,未完待续...)

你可能感兴趣的:(算法题,leetcode)