The Repeated String Match Algorithm in Javascript
- 时间:2020-10-05 13:15:44
- 分类:网络文摘
- 阅读:158 次
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.

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) —
推荐阅读:离殇 数学题:若用a型箱,正好要装800箱 数学题:神舟五号飞行轨道的近地点高度为200km 数学题:汽车在途中停了一小时,客车速度比汽车慢 数学题:东西南北两条路交叉成直角 数学题:哥哥和弟弟进行100米赛跑 数学题:把14分成若干个自然数的和 数学题:张王李赵刘5人合作完成一项工程 数学题:姐姐8年后的年龄是妹妹3年前的5倍 数学题:一个直角三角形以它的斜边为轴旋转一周
- 评论列表
-
- 添加评论