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

这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

原文地址:https://www.cnblogs.com/xiaochuan94/p/10611991.html

时间: 2024-08-30 04:44:18

LeetCode算法题-Repeated String Match(Java实现)的相关文章

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

这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是796).给定两个字符串A和B,在A上进行移位操作,规则是将A最左边的字符移动到最右边去.例如,如果A ='abcde',那么在A上移位一次后,它将是'bcdea'.当且仅当A在A上移位一定次数后可以变为B时返回True.

LeetCode算法题-Reverse Bits(Java实现)

这是悦乐书的第185次更新,第187篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第44题(顺位题号是190).给定32位无符号整数,求它的反转位.例如: 输入:43261596 输出:964176192 说明:43261596以二进制表示为00000010100101000001111010011100, 964176192以二进制表示为00111001011110000010100101000000. 本次解题使用的开发工具是eclipse,jdk使用的版本是1

LeetCode算法题-Word Pattern(Java实现)

这是悦乐书的第202次更新,第212篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第68题(顺位题号是290).给定一个模式和一个字符串str,找到str是否完全匹配该模式.完全匹配是指在模式中的字母和str中的非空单词之间存在一一对应的关系.例如: 输入:pattern ="abba",str ="dog cat cat dog" 输出:true 输入:pattern ="abba",str ="dog

LeetCode算法题-Binary Watch(Java实现)

这是悦乐书的第216次更新,第229篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第84题(顺位题号是401).二进制手表顶部有4个LED,代表小时(0-11),底部的6个LED代表分钟(0-59).每个LED代表一个零或一个,右侧的最低有效位.给定非负整数n表示当前打开的LED数量,返回手表可能代表的所有可能时间.例如: 输入:n = 1 输出:["1:00","2:00","4:00","8:00&qu

LeetCode算法题-Add Strings(Java实现)

这是悦乐书的第223次更新,第236篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415).给定两个非负整数num1和num2表示为字符串,返回num1和num2的总和. 注意: num1和num2的长度均<5100. num1和num2都只包含数字0-9. num1和num2都不包含任何前导零. 您不能使用任何内置BigInteger库或直接将输入转换为整数. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 6

LeetCode算法题-Keyboard Row(Java实现)

这是悦乐书的第245次更新,第258篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第112题(顺位题号是500).给定一个单词列表,返回可以在美国键盘的一行上使用字母表键入的单词,如下图所示. 例如: 输入:["Hello","Alaska","Dad","Peace"] 输出:["Alaska","Dad"] 注意: 您可以多次使用键盘中的一个字符. 您可

LeetCode算法题-Relative Ranks(Java实现)

这是悦乐书的第248次更新,第261篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第115题(顺位题号是506).根据N名运动员的得分,找到他们的相对等级和得分最高的三个人,他们将获得奖牌:"金牌","银牌"和"铜牌".例如: 输入:[5,4,3,2,1] 输出:["Gold Medal","Silver Medal","Bronze Medal",&quo

LeetCode算法题-Single Number(Java实现)

这是悦乐书的第175次更新,第177篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第34题(顺位题号是136).给定一个非空的整数数组,除了一个元素外,每个元素都会出现两次. 找到那个只出现了一次的元素.例如: 输入:[2,2,1] 输出:1 输入:[4,1,2,1,2] 输出:4 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 因为已经限定传入的数组不为空,所以此题不需要

LeetCode算法题-Min Stack(Java实现)

这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小元素的堆栈. push(x) - 将元素x推入堆栈. pop() - 删除堆栈顶部的元素. top() - 获取顶部元素. getMin() - 检索堆栈中的最小元素. 例如: MinStack minStack = new MinStack(); minStack.push(-2); minSta