重复叠加字符串匹配
难度:
标签:
题目描述
代码结果
运行时间: 25 ms, 内存: 16.2 MB
// Java Stream Solution
// 题目思路:
// 使用 Java Stream 实现重复字符串叠加。
// 通过 IntStream 生成重复字符串,并找到第一个包含 b 的叠加次数。
import java.util.stream.IntStream;
public class SolutionStream {
public int repeatedStringMatch(String a, String b) {
// 计算最少叠加次数
int maxCount = (int) Math.ceil((double) b.length() / a.length()) + 2;
// 使用 IntStream 生成重复字符串并检查
return IntStream.rangeClosed(1, maxCount)
.filter(i -> (a.repeat(i)).contains(b))
.findFirst()
.orElse(-1);
}
}
解释
方法:
该题解的思路是通过分情况讨论来解决问题。首先判断特殊情况,如果字符串b为空则返回0;如果字符串a的长度为1,则判断b是否完全由a组成,如果是则返回a在b中出现的次数,否则返回-1。接下来判断一般情况,如果b是a的子串,则直接返回1;如果a是b的子串,则统计a在b中出现的次数,并判断a之间的部分是否为空,以及b的开头和结尾是否能与a匹配,据此计算最小重复次数;如果b是两个a拼接而成的子串,则返回重复次数加2;其他情况返回-1。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中提到如果字符串b为空返回0,但题目中未明确说明这种情况,这样的处理是否与题目要求一致?
▷🦆
题解在处理字符串a长度为1时,有一步将b中的a替换为空字符串,然后判断结果是否为空来决定返回值。这种方法是否能准确处理所有情况,比如b中包含a以外的字符?
▷🦆
在题解中,如果b是a的子串就直接返回1。这种判断是否考虑到了b可能比a更长的情况?
▷🦆
题解试图通过拆分b为a的多个部分来处理问题,但是处理过程中如何确保拆分后的剩余部分正确地匹配a的开头或结尾?
▷