【每日一题】Day0011:力扣题库NO.686. 重复叠加字符串匹配

今天的题目读题还是很容易理解的~直接放链接:

力扣686重复叠加字符串匹配icon-default.png?t=LA92https://leetcode-cn.com/problems/repeated-string-match/题目并不麻烦,直接考虑到的就是穷举。分析字符串a和b的不同长度的情况,无非以下几种情况:

当a的长度大于等于b的时候,有3种情况,a本身直接包含b,返回1;两个a拼接后包含b,返回2;其他情况都无法达成匹配,返回-1。

当a的长度小于b的时候,最后可以提炼成一种通用情况:如果a拼接后能够匹配,那么a最多需要拼接b.length()/a.length()+2次,要么a不是b的子串,拼接2次后,a可以匹配;要么a是b的子串,b的中间部分是a串重复n次拼接,再加上头尾部分由a的头尾一部分构成,这样拼接n到n+2次能够匹配。

其实如果b中有a没有的元素,那么一定无法匹配直接返回-1即可,可以稍微节省一点时间。

代码如下:

package cn.daycode.leetcode;

public class RepeatedStringMatch {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.repeatedStringMatch("abc","cabcabca"));
    }
}

class Solution {
    public int repeatedStringMatch(String a, String b) {
        // 字符串a比字符串b长的情况(包含等于),有以下3种
        if(a.length() >= b.length()){
            // a包含b,则返回1
            if(a.contains(b)){
                return 1;
                // 两个a拼接后包含b则返回2
            }else if(a.concat(a).contains(b)){
                return 2;
            }
        // 字符串a比b短的情况,最多需要拼接b长度/a长度+2次
        }else {
            StringBuilder sb = new StringBuilder(a);
            for (int i = 0; i < b.length()/a.length()+2; i++) {
                if(sb.toString().contains(b)){
                    return i+1;
                }else{
                    sb.append(a);
                }
            }
        }

        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值