zoukankan      html  css  js  c++  java
  • 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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

  • 相关阅读:
    Django and Djangorestframework
    安装socketio出现module 'importlib._bootstrap' has no attribute 'SourceFileLoader' 错误
    pycharm 里运行 django 工程 You must either define the environment variable DJANGO_SETTINGS_MODULE 错误
    linux 安装python3
    iOS 10.3下解决Fiddler代理抓包ssl证书信任问题
    Android 7.0 fiddler代理抓不到https请求的解决办法
    python base64 decode incorrect padding错误解决方法
    Fiddler做代理服务器时添加X-Forwarder-For转发真实客户端ip
    python安装pbkdf2 遇到错误TypeError: __call__() takes exactly 2 arguments (1 given)
    soapUI通过groovy脚本设置超时时间
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10611991.html
Copyright © 2011-2022 走看看