686. Repeated String Match

Easy
Given two strings A and B, find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution, return -1.

For example, with A = “abcd” and B = “cdabcdab”.

Return 3, because by repeating A three times (“abcdabcdabcd”), B is a substring of it; and B is not a substring of A repeated two times (“abcdabcd”).

Note:
The length of A and B will be between 1 and 10000.

这道题我先是想的一直给StringBuilder sb不断地append(A),直到A.indexOf(B) != -1. 但后来发现这样做有可能导致while循环无限循环下去,因为对于那种A不管循环多少次,都不可能包含B的情况没有写终止条件。我卡在了不知道如何判断这种永远不可能包含的情况。看了答案发现其实只需要观察一下就可以写出判断条件:首先保证sb的长度要至少大于等于B, 不然B不可能成为sb的substring. 不过仅仅保证这个条件还是不够,比如sb = cdabcdab, B = abcdabcd, 这种情况就是虽然A和B长度相等,但起始字符不一样,这样也会导致A里面找不到B. 这种情况下只要再循环一遍A,使sb = cdabcdabcdab, 这样就可以确保能找到B了。所以我们判断永远也不可能找到B的条件就是sb.indexOf(B) == -1的时候,判断sb的长度是不是大于A.length() + B.length(),如果是,则说明永远也找不到,直接返回- 1.

    public int repeatedStringMatch(String A, String B) {
        StringBuilder sb = new StringBuilder(A);
        int count = 1;
        while (sb.indexOf(B) == -1){
            if (sb.length() - A.length() > B.length()){
                return -1;
            }
            sb.append(A);
            count++;
        }
        return count;
    }
}
    原文作者:greatfulltime
    原文地址: https://www.jianshu.com/p/40701aa102d5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞