LeetCode 686 重复叠加字符串

  • 链接 : 原题

  • 题意 :
    给定一个字符串a和b,判断 a重复加自身几次,b才是a的子串。

  • 思路:
    这里的子串是连续子串,并不是按顺序存在b里所有字母即可。所以我用的是 string里的find。
    题目说如果永远不可能,就输出-1,那么这个判定条件颇耐人寻味。如果不断加a后的字符串str的长度 > a + b的长度 - 1,那么b就不可能是a的子串了。

    原因很简单,我们设 len1是a的长度,len2是b的长度。判断b是否是a的子串,就从 a[0] ——a[len1-1] ,向后选取 len2 的字符串,判断是否和b相等。而当不断加a后的字符串长度 > a+b - 1后,再添加a,生成的 len2长度的子串 是重复的。
    举个例子说:
    A = abc len1 = 3
    B = acacacac len2 = 8
    当A长度 < B 长度时,自然不用多说,不满足。
    当A = abcabcabc时,判断B是否是A的子串,从A[0]开始选取 长度为8的字符串:
    abcabcab bcabcabc 都不满足
    当A = abcabcabcabc时,
    abcabcab bcabcabc cabcabca 都不满足,接下来所有的字符串都是重复的,因为A 原始3个字符为起始,长度为8的字符串都选取完了。而满足能将 A原始len1 个 字符起始,长度为len2的字符串选取完的字符串长度 > len1 + len2 - 1.

  • 代码:

class Solution {
    
    
public:
    int repeatedStringMatch(string A, string B) {
    
    
        int t = 1;
        string tmp = A;
        int len1 = A.length(), len2 = B.length();
        while(tmp.find(B) == -1){
    
    
            if(tmp.length() > len1 + len2 - 1){
    
    
                return -1;
            }
            tmp += A;
            t++;
        }
        return t;
    }
};
  • 遇到的问题:
    (1)对子串的意思搞错了。直接用 string的find即可。
    (2)对跳出循环判断条件没想到。

猜你喜欢

转载自blog.csdn.net/qq_39763472/article/details/105880325