leetcode
leetcode 601 ~ 650
重复叠加字符串匹配

重复叠加字符串匹配

难度:

标签:

题目描述

代码结果

运行时间: 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,但题目中未明确说明这种情况,这样的处理是否与题目要求一致?
题解中将字符串b为空时返回0的处理方式基本上是符合逻辑的假设。在实际问题场景中,如果b为空,那么不需要重复a就可以匹配到b,因为b没有内容需要被匹配。这可以被视为一种边界条件的合理处理,尽管题目未明确说明,但此处理方式是为了增强算法的鲁棒性。
🦆
题解在处理字符串a长度为1时,有一步将b中的a替换为空字符串,然后判断结果是否为空来决定返回值。这种方法是否能准确处理所有情况,比如b中包含a以外的字符?
这种方法在处理b中包含a以外的字符时会失败。例如,如果a是'x'而b是'xy',此方法会将'x'替换为'',结果是'y',这不是空字符串,但实际上'a'并不能通过重复匹配整个字符串'b'。因此,这种处理方法只适用于b完全由多个a构成的情况,无法准确处理b包含其他字符的情况。
🦆
在题解中,如果b是a的子串就直接返回1。这种判断是否考虑到了b可能比a更长的情况?
这种判断没有问题,因为如果b是a的子串,不论b的长度与a的长度如何比较,b已经完全包含在a中了,这意味着不需要额外重复a即可匹配到b。所以,即使b的长度大于a,只要b能作为a的一部分出现,就可以直接返回1。
🦆
题解试图通过拆分b为a的多个部分来处理问题,但是处理过程中如何确保拆分后的剩余部分正确地匹配a的开头或结尾?
在题解中,确保拆分后的剩余部分正确地匹配a的开头或结尾是通过明确的字符串操作来完成的。对于剩余部分,算法检查a是否以剩余部分开头(如果剩余部分在b的结尾)或a是否以剩余部分结尾(如果剩余部分在b的开头)。如果这些条件被满足,那么重复次数会相应增加。如果条件不符,就会返回-1,表示无法通过重复a来匹配整个b。这样的处理确保了只有当b的非重复部分能与a的相应部分匹配时,才会计算为有效重复。

相关问题

重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

 

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

输入: s = "aba"
输出: false

示例 3:

输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

 

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成