这是悦乐书的第289次更新,第307篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686)。给定两个字符串A和B,找到A必须重复的最小次数,使得B是它的子字符串。 如果没有这样的解决方案,返回-1。例如:

输入:A =“abcd”,B =“cdabcdab”。

输出:3

说明:因为重复A三次(“abcdabcdabcd”),B是它的子串; 和B不是A重复两次的子串(“abcdabcd”)。

注意:A和B的长度在1到10000之间。

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

02 第一种解法

特殊情况:如果B的长度为0,直接返回0。

正常情况:使用循环,依次累加A,然后判断在累加后的字符串中是否存在字符串B,借助indexOf方法实现,同时统计累加的次数,如果能够找到,就返回最后的次数。但是有一种情况需要考虑,如果B根本就不是由A多次累加组成,那么循环就容易变成死循环,所以,在循环外面我们取得A和B的长度之商,如果count比商要大2,就直接返回-1。

public int repeatedStringMatch(String A, String B) {
if (B.length() == 0) {
return 0;
}
int len = B.length()/A.length();
int count = 1;
String C = A;
while (C.indexOf(B) < 0) {
C += A;
count++;
if (count-len > 2) {
return -1;
}
}
return count;
}

03 第二种解法

在第一种解法的基础上,我们还可以再优化下。依旧使用循环,只要A的长度小于B的长度,就累加一次A,并记数,然后开始判断累加后的A与B是否存在B是A的子串的关系。如果在A中能够直接找到B,就返回count;如果需要再累加一次A才能找到B,那么就返回count加1;如果前面两种情况都不符合,就返回-1。

public int repeatedStringMatch(String A, String B) {
int count = 1;
StringBuilder sb = new StringBuilder(A);
while (sb.length() < B.length()) {
sb.append(A);
count++;
}
if (sb.indexOf(B) >= 0) {
return count;
}
if (sb.append(A).indexOf(B) >= 0) {
return count+1;
}
return -1;
}

04 小结

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

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

最新文章

  1. r.js结合gulp等于webpack(angular为例)
  2. 【代码笔记】iOS-忘记密码选择整体button
  3. SharePoint 2016 Beta 2 安装体验
  4. 利用Java自带的MD5加密
  5. ThinkBox DOC
  6. 双击GridView查看详情
  7. HDU 3836 Equivalent SetsTarjan+缩点)
  8. jsp数据
  9. a:hover 等伪类选择器
  10. windows下,提权代码.
  11. 通过read()读文件
  12. laravel-第一課安裝
  13. LeetCode--112--路径总和
  14. 『科学计算』科学绘图库matplotlib练习
  15. webuploader 上传传自定义参数
  16. 安装vue后报错 bash: vue: command not found
  17. MySQL 忘记密码怎么办?
  18. Highmaps网页图表教程之数据标签与标签文本
  19. CentOS下Storm 1.0.0集群安装具体解释
  20. js上传本地图片遇到的问题

热门文章

  1. 经典案例复盘——运维专家讲述如何实现K8S落地
  2. Chapter 4 Invitations——22
  3. 大战Java虚拟机【2】—— GC策略
  4. PE知识复习之PE的导入表
  5. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流
  6. jmeter 分布式压测(windows)
  7. 使用codis-admin搭建codis集群
  8. Shell编程(week4_day2)--技术流ken
  9. 学JAVA第三天,JAVA第二章《JAVA数据类型》
  10. Python中文词频统计