这是悦乐书的第236次更新,第249篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第103题(顺位题号是459)。给定非空字符串检查是否可以通过获取它的子字符串并将子字符串的多个副本附加在一起来构造它。 您可以假设给定的字符串仅由小写英文字母组成,其长度不超过10000。例如:

输入:“abab”

输出:true

说明:它是子串“ab”两次。

输入:“aba”

输出:false

输入:“abcabcabcabc”

输出:true

说明:它是子串“abc”四次。 (和子串“abcabc”两次。)

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:当s为null或者s的长度小于等于1时,直接返回false。

正常情况:从1开始,截取s的第0到第1位,然后使用StringBuilder类,累加截取的字符串组成新的字符串,然后比较新旧字符串是否相等,如果相等,直接返回true,反之,截取s的第0到第2位,继续之前的操作和判断。

在外层循环中,指针i是小于等于二分之s的长度的,因为子字符串至少要匹配一次,所以i是小于等于len/2的。在外层循环开始的时候,我们可以加多一步判断,省去没必要的计算,如果len对i取余不等于0,就结束当前循环,进入下一次循环。例如,len等于9,i则小于等于4,我们只用计算i等于1和3的情况即可,2和4是不可能满足子字符串要求的。

public boolean repeatedSubstringPattern(String s) {
if (s == null || s.length() <= 1) {
return false;
}
int len = s.length();
for (int i=1; i<=len/2; i++) {
if (len%i != 0) {
continue;
}
String str = s.substring(0, i);
StringBuilder sb = new StringBuilder();
for (int j=0; j<len/i; j++) {
sb.append(str);
}
if (s.equals(sb.toString())) {
return true;
}
}
return false;
}

03 第二种解法

特殊情况:当s为null或者s的长度小于等于1时,直接返回false。

正常情况:思路和第一种解法类似,只是将内层循环中使用StringBuilder类换成了截取字符串,每次从i开始,往后截取i个长度的子串,然后判断两个子串是否相等。

public boolean repeatedSubstringPattern2(String s) {
if (s == null || s.length() <= 1) {
return false;
}
int len = s.length();
for (int i=1; i<=len/2; i++) {
if (len%i != 0) {
continue;
}
String str = s.substring(0, i);
boolean flag = true;
for (int j=i; j<len; j += i) {
if (!str.equals(s.substring(j, j+i))) {
flag = false;
break;
}
}
if (flag) {
return true;
}
}
return false;
}

04 第三种解法

此解法来自提交代码里排第一位置的,思路比较巧妙,利用了kmp算法,感兴趣的同学可以去看下CSDN上July大神的一篇介绍kmp算法的博文,传送门:https://blog.csdn.net/v_JULY_v/article/details/7041827

public boolean repeatedSubstringPattern3(String s) {
int len = s.length();
if (len < 2) {
return false;
}
char lastChar = s.charAt(len-1);
int index = s.indexOf(lastChar);
// 思想是: 找到最后一个字符所在的位置,那么如果是pattern,则一定有
// len%(index+1)== 0。 那么pattern应该是从0到index位置的子串。
while (index >=0 && index < len-1) {
if (len % (index+1) == 0) {
String pattern = s.substring(0, index+1);
if (foundPattern(s, pattern)) {
return true;
} else {
//否则找下一个出现lastChar的位置
index = s.indexOf(lastChar, index+1);
}
} else {
//否则找下一个出现lastChar的位置
index = s.indexOf(lastChar, index+1);
}
}
return false;
} private boolean foundPattern(String s, String pattern) {
int fromIndex = pattern.length();
int n = fromIndex;
while (fromIndex < s.length()) {
if (!pattern.equals(s.substring(fromIndex, fromIndex + n))) {
return false;
}
fromIndex += fromIndex;
}
return true;
}

05 第四种解法

还有更加疯狂的解法,两行代码搞定。方法是将s和自身连接组成一个新的字符串,然后从第二位开始,截取子字符串到倒数第二位,得到的子字符串再去判断是否包含s字符串序列。

思路是这样的,如果s是由可连续的子串组成,那么将其重复一遍后,重复子串的数量是原来的2倍,再将其去头去尾,那么中间至少会存在一个完整的s,如果s是由单字母组成,就会存在多个s。反之,如果s不是由连续子串组成,在进行上面的操作后,中间部分是不可能存在s的,因为不具备连续性,再重复一遍的新字符串肯定也不具备连续性。

此解法的时间复杂度不是O(1),因为使用了contains方法,时间复杂度好的情况是O(n),坏的情况是O(n^2)。

public boolean repeatedSubstringPattern4(String s) {
String str = s + s;
return str.substring(1, str.length() - 1).contains(s);
}

06 小结

算法专题目前已日更超过三个月,算法题文章103+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Repeated Substring Pattern(Java实现)的更多相关文章

  1. LeetCode算法题-Repeated String Match(Java实现)

    这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...

  2. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  3. LeetCode算法题-Detect Capital(Java实现)

    这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...

  4. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  5. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  6. LeetCode算法题-Flood Fill(Java实现)

    这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...

  7. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

  8. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  9. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

随机推荐

  1. Vim 复制粘帖格式错乱问题的解决办法

    有时候,复制文本(尤其是代码)到 Vim,会出现格式错乱的问题.看样子,应该是自动缩进惹得祸.本文不去深究原因,直接给出解决方法. 1. paste 模式 运行如下命令,进入 paste 模式: :s ...

  2. redis 系列27 Cluster高可用 (2)

    一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可以会出现该槽中的一部分键值对保存在源节点 ...

  3. SpringBoot入门教程(六)SpringBoot2.0统一处理404,500等http错误跳转页

    在做web项目的时候,大家对404.500等http状态码肯定并不陌生.然而无论是哪种"非正常"状态码,都不是我们想遇到的.尤其像一些500这种服务器内部错误,不愿意展示给用户的, ...

  4. 大战Java虚拟机【2】—— GC策略

    前言 前面我们已经知道了Java虚拟机所做的事情就是回收那些不用的垃圾,那些不用的对象.那么问题来了,我们如何知道一个对象我们不需要使用了呢?程序在使用的过程中会不断的创建对象,这些所创建的对象指不定 ...

  5. 互联网视频直播技术(广电总局、优酷土豆、XX直播)

    互联网直播是目前最火的技术之一,涵盖了很多方面的知识(网络,CDN,GPU,算法,图像处理),以下我介绍互联网直播的大体框架和关键技术点: 一.前端视频流协议 前端流主要包括UDP.RTMP.RTSP ...

  6. 补习系列(2)-springboot mime类型处理

    目标 了解http常见的mime类型定义: 如何使用springboot 处理json请求及响应: 如何使用springboot 处理 xml请求及响应: http参数的获取及文件上传下载: 如何获得 ...

  7. linux磁盘管理系列一:磁盘配额管理

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  8. 不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux

    我是用的是secureCRT,远程连接我的虚拟机里面的ubuntu 直接报错,连接不上 1,先分别在windows上ipconfig和ubuntu上ifconfig下 互ping一下,是可以ping通 ...

  9. spring-mvc里的 <mvc:resources> 及静态资源访问

    在进行Spring MVC的配置时,通常我们会配置一个dispatcher servlet用于处理对应的URL.配置如下: <servlet> <servlet-name>Sp ...

  10. 四种途径提高RabbitMQ传输数据的可靠性(二)

    前言 上一篇四种途径提高RabbitMQ传输消息数据的可靠性(一)已经介绍了两种方式提高数据可靠性传输的方法,本篇针对上一篇中提出的问题(1)与问题(2)提出解决常用的方法. 本文其实也就是结合以上四 ...