题目:
Given two strings A and B, find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution, return -1. For example, with A = "abcd" and B = "cdabcdab". Return 3, because by repeating A three times (“abcdabcdabcd”), B is a substring of it; and B is not a substring of A repeated two times ("abcdabcd"). Note:
The length of A and B will be between 1 and 10000.

理解:

给出两个字符串,找到A重复的最小次数,使得B字符串是A重复后的子字符串,如果没有答案则返回-1。

举个例子,A="abcd",B = "cdabcdab",返回结果 3, 因为A重复三次以后,"abcdabcdabcd",此时B就是A的一个子字符串了,而且3是最小的重复次数,因为重复两次的时候“abcdabcd”不能使B成为A的子字符串。

注意:A和B字符串的长度在1到10000之间

原始解题思路:

建立一个循环,记录循环次数,拼接A字符串为C,然后判断B是否在C内,如果存在则输出循环次数,如果不同,则继续循环。

如果C的长度大于10000,则返回-1。

python 代码:

def repeatedStringMatch(A, B):
i = 1
C = A
while(1):
if B in C:
return i
else:
i = i + 1
C = C + A
if len(C) > 10000:
return -1

验证结果:

Runtime: 240 ms, faster than 18.07% of Python3 online submissions for Repeated String Match.
Memory Usage: 13.3 MB, less than 5.19% of Python3 online submissions for Repeated String Match.
 
改进思路:
  • 尽可能减少循环次数
有一点很重要,那就是究竟A重复多少次可以确定B一定不是A的子字符串,
举个例子,A="abca",B="aa",可以看到A重复一次B就可以成为子字符串,那是因为A的首和尾叠加了,使得B的两个字符成功衔接起来。
第二个例子:A =“abca”与B = “caab”,同样也是一次。
最多重复次数应该与A和B的长度都有关系,在第二个例子中,A与B的长度相同,如果A重复了一次还没有得到结果,那么可以断定,A再重复自己也不能使得B成为子字符串
首先假设B的长度是A的长度的n倍(取整)。
根据第二个例子举例:
依然假设B的长度为4,那么无论A重复多少次,B都是一个在A重复多次后的字符串(假设为C)上长度为4的滑动窗口,
A = abca
B = 长度为4的字符串
n = 1
abcaabcaabca
abcaabcaabca
……依次类推,可以看到B共有3个可能性,看到这里一部分人可能想到了,B的长度越长,意味着滑动窗口可能占用的重复字符串数越多,
继续举例:
A = abca
B = 长度为10的字符串
n = 2
abcaabcaabca
abcaabcaabca
abcaabcaabca
写到这里,很明显的发现三次循环已经无法适用于n等于2的情况了,只有当四次循环的时候才可能包括所有的B字符串可能的组合结构。
简单归纳起来,我们可以发现,A字符串最多需要重复n+2次即可确定是否有结果,因此改进程序:

def repeatedStringMatch(A, B):
  C = ""
  for i in range(int(len(B)/len(A))+ 3):
    if B in C:
      return i
    C += A
  return -1

验证结果:

Runtime: 152 ms, faster than 68.14% of Python3 online submissions for Repeated String Match.
Memory Usage: 13.1 MB, less than 5.19% of Python3 online submissions for Repeated String Match.
 
 
 
 
 

LeetCode686——Repeated String Match的更多相关文章

  1. Leetcode686.Repeated String Match重复叠加字符串匹配

    给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1. 举个例子,A = "abcd",B = " ...

  2. LeetCode 686. 重复叠加字符串匹配(Repeated String Match)

    686. 重复叠加字符串匹配 686. Repeated String Match 题目描述 给定两个字符串 A 和 B,寻找重复叠加字符串 A 的最小次数,使得字符串 B 成为叠加后的字符串 A 的 ...

  3. 【Leetcode_easy】686. Repeated String Match

    problem 686. Repeated String Match solution1: 使用string类的find函数: class Solution { public: int repeate ...

  4. 【LeetCode】686. Repeated String Match 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. [Swift]LeetCode686. 重复叠加字符串匹配 | Repeated String Match

    Given two strings A and B, find the minimum number of times A has to be repeated such that B is a su ...

  6. [LeetCode] Repeated String Match 重复字符串匹配

    Given two strings A and B, find the minimum number of times A has to be repeated such that B is a su ...

  7. Leetcode 686 Repeated String Match

    Given two strings A and B, find the minimum number of times A has to be repeated such that B is a su ...

  8. 686. Repeated String Match 字符串重复后的子字符串查找

    [抄题]: Given two strings A and B, find the minimum number of times A has to be repeated such that B i ...

  9. LeetCode Repeated String Match

    原题链接在这里:https://leetcode.com/problems/repeated-string-match/description/ 题目: Given two strings A and ...

随机推荐

  1. spring中ehcache的配置和使用方法

    继续上篇,这篇介绍服务层缓存,ehcache一般的配置和用法 一.添加jar包引用 修改pom.xml文件,加入: <dependency> <groupId>org.spri ...

  2. 08.Django基础六之ORM中的锁和事务

    一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...

  3. ASP.NET Core 3.0 : 二十四. 配置的Options模式

    上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式.(ASP.NET Core 系列目录) 一.Options的使用 上一章有个配置的绑定的例子,可 ...

  4. Hadoop-1,web页面调用报无hbase.jar包【以解决】 2,报java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem;【以解决】

    1:web页面调用报无hbase.jar包 本来java文件就没有问题,但是jsp一调用那个java文件里的方法就报错,报的无hadoop/hbase相关报的问题. 主要解决方法是: 复制hbase/ ...

  5. map转换成com.google.gson.JsonObject

    String json =new Gson().toJson(map); JsonObject jsonObject =new JsonParser().parse(json).getAsJsonOb ...

  6. 构建于 B/S 端的 3D 摄像头可视化监控方案

    前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...

  7. gitblit在windows10上的安装及服务启动报错处理

    折腾一下午算是装好了,心情不错决定分享一下.安装步骤大同小异网上都有,主要是Failed creating java 这个报错,百度出来的没有一个能给我解决的,摸索半天找出一个自己的方式.为报错而来的 ...

  8. Vue三步完成跨域请求

    三步完成跨域请求 ①main.js中: Vue.prototype.HOME = '/api'; ② config/index.js中: module.exports = { dev: { // Pa ...

  9. Curl的移植编译以及注意事项

    最近需要用curl来发送http请求,遇到了不少问题,查了不少资料,都是零零散散的,现在总结下.   1.移植编译 ./configure --prefix=$(PWD)/build --host=a ...

  10. poll(2) 源码分析

    poll(2) poll(2) 系统调用的功能和 select(2) 类似:等待一个文件集合中的文件描述符就绪进行I/O操作. 使用 实现 select(2) 的局限性: 关注的文件描述符集合大小最大 ...