Day 10 | 459.重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:

输入: s = "aba"
输出: false

移动匹配法

解题思路:将两个s进行拼接组成新字符串ss。ss去掉首尾字符后若包含原字符串s,则代表s可由子串重复组成。

abab -> ss: abababab -> 去首尾:ss:bababab 包含( s:abab ) 其实就是去掉首的s的后半部分与去掉尾的s的前半部分重复,可以组成s。

        String ss=s+s;
        ss=ss.substring(1,ss.length()-1);
        return ss.contains(s);

KMP算法

KMP算法:若为周期函数,数组长度 - next数组的最后一位 即为周期长度。

先求字符串的next数组,若最后一位next数组存放元素大于0且周期能被数组长度整除,则代表为周期串。


        int[] next = new int[s.length()];
        //先求next数组
        int j = 0;
        for (int i = 1; i < s.length(); i++) {
            while (j > 0 && s.charAt(j) != s.charAt(i)) {
                j = next[j - 1];
            }
            if (s.charAt(j) == s.charAt(i)) {
                j++;
            }
            next[i] = j;
        }
//如果next数组最后一位不为0 且 数组长度减去next最后一位 能被 数组长度整除 则为周期串 且周期串长度为数组长度减去next最后一位
        int len = s.length();
        if (next[len - 1] > 0 && len % (len - next[len - 1]) == 0) {
            return true;
        }
        return false;

错位法

看力扣上的大佬的解法,其实也是懵懵懂懂。

JAVA 什么?你2ms就结束了?又快又短?! - 重复的子字符串 - 力扣(LeetCode)

0-i作为一个子串。i从1开始判断(i必须可以被len整除才可以作为子串),若【0,i】==【len-i,len】则可试将0-i作为一个基串。在进行判断出去基串的剩余串【i,len】与【0,len-i】是否相等,若相等,则说明该字符串由基串构成。

    public static boolean repeatedSubstringPattern(String s) {
        int i=1;
        int len=s.length();
        while (i<len){
            if(len%i!=0){i++; continue;}
            else{
                if(s.substring(0,i).equals(s.substring(len-i,len))){
                    if(s.substring(i,len).equals(s.substring(0,len-i))){return true;}
                }
            }
            i++;
        }
        return false;
    }

小tip:截取字符串用substring[index1,index2)方法。左闭右开

以下是使用SQL语言实现以上函数的示例代码: 1. 计算字符串长度 ```sql SELECT LENGTH("Hello World!"); -- 输出结果为 12 SELECT LENGTH("University"); -- 输出结果为 10 ``` 2. 获取字符串 ```sql SELECT SUBSTRING("Nice to meet you!", 6, 4); -- 输出结果为 meet ``` 3. 重复输出字符串 ```sql SELECT REPEAT("Cheer!", 3); -- 输出结果为 Cheer!Cheer!Cheer! ``` 4. 字符串逆序输出 ```sql SELECT REVERSE("voodoo"); -- 输出结果为 oodoov ``` 5. 按顺序排列字符串并选取部分组成新字符串 ```sql SELECT CONCAT("MySQL", "is", "great", "not") AS str FROM (SELECT 1 AS id UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t WHERE id IN (1, 3, 4) ORDER BY id; -- 输出结果为 MySQLgreatnot ``` 6. 计算日期相关信息 ```sql SELECT WEEK(CURDATE()) AS week_of_year, DAYOFYEAR(CURDATE()) AS day_of_year, DAYNAME(CURDATE()) AS day_of_week, DAYOFWEEK(CURDATE()) AS day_in_week, DAYOFWEEK(CURDATE()) + ((WEEK(CURDATE()) - 1) * 7) - 1 AS day_in_workweek; -- 输出结果为 当前日期是第32周,第2天,星期二,一周中的第2天,第8个工作日 ``` 7. 查看当前连接状态 ```sql SHOW PROCESSLIST; ``` 8. 加密字符串 ```sql SELECT ENCODE("MySQL", "secret_key") AS encoded_str; -- 加密字符串 SELECT DECODE(encoded_str, "secret_key") AS decoded_str; -- 解密字符串 ``` 9. 将十进制值转换为十六进制值 ```sql SELECT HEX(100); -- 输出结果为 64 ``` 10. 格式化数值 ```sql SELECT ROUND(5.1584, 3); -- 输出结果为 5.158 ``` 11. 修改字符串字符集 ```sql SELECT CONVERT("new string" USING gb2312); -- 将字符串的字符集转换为 gb2312 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值