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

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

示例 2:
输入: “aba”
输出: False

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

思路:

这题其实就是让你判断一个字符串是不是由一个相同的子串多次重复构成的。所以,最低最低也是由子串重复两次构成的。也就是说,字符串其实是由>=2个的相同子串构成。
双倍字符串解法:
1.将字符串扩充成双倍,new string=s+s
2.去掉扩充后的第一个和最后一个字符
3.判断去掉头尾的字符串string是否包含原来的s
解释双倍字符串解法:
假设,字符串是由n个相同子串构成,n>=2对吧?那么,将字符串扩充成双倍,就包含了2n个相同子串。此时,去掉头尾一个字符,最坏情况就是破坏了两个子串,此时还剩下2n-2个子串。如果此时判断包含了原串,原串由n个子串构成,那就是2n-2>n对吧?移项后n>2,得出结论了,至少包含两个子串。这题其实是个数学问题,靠想不容易想明白,式子一列就出来了。

代码:

判断字符串包含我用的kmp实现的,因为Java内置的contains方法效率是打败38%,kmp能打败92%,效率更好。
kmp算法思想:https://blog.csdn.net/weixin_43923436/article/details/108670029

 public static boolean repeatedSubstringPattern(String s) {String str=s.substring(1)+s.substring(0,s.length()-1);return kmp(str,s);}public static boolean kmp(String str,String s){char[] T = str.toCharArray();char[] S = s.toCharArray();//定义next数组,next数组是根据短串生成的,别搞错了。//因为索引0没用到,因此数组长度加1int[] next=new int[s.length()+1];//定义两个指针int j=1;int k=0;//定义next[1]=0,next[1]=0表示短串已经回溯到头了,此时应该移动长串next[1]=0;//生成next数组,生成next数组的思路在图中详细解释while(j<s.length()){if(k==0||S[j-1]==S[k-1]){next[++j]=++k;}else {k=next[k];}}int i=1;int l=1;while (i<=T.length&&l<=S.length){//如果匹配成功,长串短串依次加1。//如果匹配失败,短串用next数组回溯,如果回溯到next[1]=0时,l=0,此时表示短串回溯到头了,//短串不能再回溯了,长串应该往后一位了(对应情况:如果第一位都不匹配,next[1]=0,长串应该后移一位)if(l==0||T[i-1]==S[l-1]){i++;l++;}else {l=next[l];}}//l>S.length说明上面的while循环是短串遍历完跳出来的,对应匹配成功的情况if(l>S.length){return true;}else {return false;}}

力扣leetCode459之重复的子字符串(双倍字符串解法)Java相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java

    <LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...

  2. 《LeetCode力扣练习》剑指 Offer 28. 对称的二叉树 Java

    <LeetCode力扣练习>剑指 Offer 28. 对称的二叉树 Java 一.资源 题目: 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的 ...

  3. 《LeetCode力扣练习》剑指 Offer 27. 二叉树的镜像 Java

    <LeetCode力扣练习>剑指 Offer 27. 二叉树的镜像 Java 一.资源 题目: 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 例如输入: 4 / 2 7 / \ / ...

  4. 《LeetCode力扣练习》第33题 搜索旋转排序数组 Java

    <LeetCode力扣练习>第33题 搜索旋转排序数组 Java 一.资源 题目: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下 ...

  5. 《LeetCode力扣练习》第121题 买卖股票的最佳时机 Java

    <LeetCode力扣练习>第121题 买卖股票的最佳时机 Java 一.资源 题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价 ...

  6. 《LeetCode力扣练习》第53题 最大子数组和 Java

    <LeetCode力扣练习>第53题 最大子数组和 Java 一.资源 题目: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...

  7. 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...

  8. 力扣217.存在重复元素 使用多种方法

    题目描述 给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false . 示例 示例 1: 输入: [1,2,3, ...

  9. 9.9 力扣652. 寻找重复的子树

    652. 寻找重复的子树 - 力扣(LeetCode) 给定一棵二叉树 root,返回所有重复的子树. 对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 如果两棵树具有相同的结构和相同的结 ...

最新文章

  1. 在各路由器进行OSPF的基本配置
  2. asp.net必须要放在form中吗_传闻:已经有人在0.33或0.34集成了Echarts(更新中)
  3. java php python 高并发_关于php如何调用Python快速发送高并发邮件的示例代码
  4. tensorflow学习笔记:tf.data.Dataset,from_tensor_slices(),shuffle(),batch()的用法
  5. (十八)深入浅出TCPIP之HTTP和HTTPS
  6. 乱码 讯飞 语音识别_一段讯飞、百度等语音识别API无法识别的语音最终解决办法...
  7. c语言图案问题,C语言绘图问题
  8. index.php上传到服务器找不到站点,ThinkPHP上传到服务器出现404,未找到index.php模板等问题...
  9. PATB1017 A除以B
  10. 计蒜客 16876 韩梅梅的抽象画
  11. samba服务的原理与搭建(转的别人的)
  12. 记一次Win10环境python3.7安装dlib模块趟过的坑
  13. Oracle队列锁enq:TS,Temporary Segment (also TableSpace)
  14. 常规英文字体 电商_最强电商美工逆袭系列1——最全的电商字体应用详解
  15. mpchart点击_在MPAndroidChart中,如何为Barchart中的每个Bar添加click事件?
  16. stm32_GPIO模拟I2c读写EEPROM
  17. Matlab颜色转换——基于RGB分量的彩色图像的颜色转换
  18. 如何半小时免费搭建NGINX网站?
  19. 中学学生成绩管理系统
  20. 记录:php上传图片至服务器 并返回显示图片地址

热门文章

  1. 最新!中国内地大学ESI排名出炉:362所高校上榜!
  2. 既生 Redis 何生 LevelDB?
  3. java steam collect,Java8 Steam 随笔记录
  4. 通过logback-spring.xml配置,概述log4j与logback之间的使用
  5. java国际象棋棋牌_用java画国际象棋棋盘
  6. 【以太网模块调试记录】ZLG EPORTM集成式RJ45调试记录(STM32/GD32)
  7. 学物联网必须要知道的云平台ThingsBoard
  8. 大力智能台灯T6 结构拆解
  9. 【SSA三维路径规划】基于matlab麻雀算法无人机三维航迹规划【含Matlab源码 301期】
  10. 单链表Java数据结构