今天的题目读题还是很容易理解的~直接放链接:
力扣686重复叠加字符串匹配https://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;
}
}