The Repeated String Match Algorithm in Javascript

  • 时间:2020-10-05 13:15:44
  • 分类:网络文摘
  • 阅读:124 次

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”).

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

JS The Repeated String Match Algorithm in Javascript algorithms javascript string

NodeJs / Javascript

The most intuitive way is to concatenate A until the length is bigger than the string B – as it will not match B concatenating more A’s.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * @param {string} A
 * @param {string} B
 * @return {number}
 */
var repeatedStringMatch = function(A, B) {
    var c = "";
    for (var i = 0; i < B.length/A.length + 1; ++ i) {
        c += A;
        if (c.includes(B)) {
            return i + 1;
        }
    }
    return -1;
};
/**
 * @param {string} A
 * @param {string} B
 * @return {number}
 */
var repeatedStringMatch = function(A, B) {
    var c = "";
    for (var i = 0; i < B.length/A.length + 1; ++ i) {
        c += A;
        if (c.includes(B)) {
            return i + 1;
        }
    }
    return -1;
};

We use the Javascript‘s String.prototype.includes() method to check if a string has included another substring. As this algorithm is not trivial e.g. KMP to check if a string is substring of another, we want to reduce the number of substring checks.

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * @param {string} A
 * @param {string} B
 * @return {number}
 */
var repeatedStringMatch = function(A, B) {
    var c = "";
    var q = 0;
    for (; c.length < B.length; q ++) c += A;
    if (c.includes(B)) return q;
    if ((c + A).includes(B)) return q + 1;
    return -1;
};
/**
 * @param {string} A
 * @param {string} B
 * @return {number}
 */
var repeatedStringMatch = function(A, B) {
    var c = "";
    var q = 0;
    for (; c.length < B.length; q ++) c += A;
    if (c.includes(B)) return q;
    if ((c + A).includes(B)) return q + 1;
    return -1;
};

The above is the optimised version for the string match algorithm. For a string to be able to include another substring, it has to be more lengthy than another, therefore, we concatenate the string until the length is more than the target string. Then we perform one String.prototype.include check, if it is not successful, we concatenate one more time and perform another check.

This algorithm requires at most two calls to String.prototype.include() method. And it requires O(B/A) complexity to perform the string concatenation.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
Back To School 2016: How To Rock (And Profit) With Sales And Mar  The Five Fundamentals to Creating a Powerhouse Blog  Blog On The Go With These Mobile Apps  Here’s Why Your Content is Struggling  Cloud Hosting vs. Traditional Hosting: Why Hosting Your Blog in   How to Compute the N-th Tribonacci Number using Iterative Dynami  How to Find the Largest Unique Number in Array (C++)?  How to Find the K-diff Pairs in an Array with Two Pointer or Has  String Algorithm: Reverse the first k characters for every 2k ch  How to Generate Parentheses using Bruteforce or Depth First Sear 
评论列表
添加评论