JavaScript 检查一个字符串是否为另一个字符串的子字符串
在这个问题中,我们需要确保字符串String2是否包含字符串String1作为子字符串。
我们首先将介绍解决问题的朴素方法,即在String2中找到所有与String1长度相同的子字符串。此外,我们将使用内置方法如match(),includes()和indexOf()方法在String2中找到String1子字符串。
问题说明 − 给定一个不同长度的字符串String1和String2。我们需要检查字符串String1是否作为子字符串存在于字符串String2中。
示例
输入
string1 = "tutor"; string2 = "pointtutorial";
输出
Yes
解释 − 当字符串1作为子串存在于字符串2中时,输出“yes”。
输入
string1 = "cde"; string2 = "pointtutorial";
输出
No
解释 −它打印No,因为string1不存在于string2中。
输入
string1 = "trsedf"; string2 = "rtel";
输出
No
说明 − 由于字符串2的长度小于字符串1的长度,所以打印出No。
方法1
在这个方法中,我们将找出所有长度与字符串1的长度相等的子字符串。然后,我们将与字符串1进行匹配,如果它们相等,我们可以说字符串2包含字符串1作为子字符串。
步骤
步骤1 − 定义len1和len2变量,并将它们分别初始化为字符串1和字符串2的长度。
步骤2 − 从字符串2的第0个索引开始遍历到(len2 – len1)个索引。
步骤3 − 使用嵌套循环,进行len1次迭代。
步骤4 − 如果string2[p + q] != string1[q]
为真,就退出循环。
步骤5 − 循环迭代后,如果q == len1
,则嵌套循环已经进行了总共len1次迭代,即字符串1存在作为子字符串。返回p。
步骤6 − 最后返回-1。
示例
这里将alpha2[p+q]与alpha[q]匹配的目的是将字符串2中从第pth索引开始的子字符串与字符串1进行匹配。
function S1isSubOfS2(alpha1, alpha2) {
// finding the length of strings
var len1 = alpha1.length;
var len2 = alpha2.length;
// Traverse the alpha2 to find alpha1
for (var p = 0; p <= len2 - len1; p++) {
var q;
for (q = 0; q < len1; q++) {
if (alpha2[p + q] != alpha1[q])
break;
}
if (q == len1) return p;
}
return -1;
}
var string1 = "tutor";
var string2 = "pointtutorial";
if (S1isSubOfS2(string1, string2) != -1) {
console.log("String1 is present in String2 as a substring.");
} else {
console.log("String 1 is not present in String2 as a substring.");
}
输出
String1 is present in String2 as a substring.
时间复杂度 − O(len1*len2),因为我们遍历字符串2并找到从索引p开始的长度为len1的子字符串。
空间复杂度 − O(1),因为我们不使用动态空间。
方法2
在这个方法中,我们将使用JavaScript内置的indexOf()方法。indexOf()方法允许我们在一个字符串中找到另一个字符串中特定字符的索引。
示例
在此示例中,我们使用alpha2字符串作为indexOf()方法的参考,并将alpha1字符串作为参数传递。如果alpha1在alpha2中找不到,它返回-1。否则,它返回子字符串的索引。
function S1isSubOfS2(alpha1, alpha2) {
// Using the indexOf() method
return alpha2.indexOf(alpha1);
}
var string1 = "tutor";
var string2 = "pointtutorial";
if (S1isSubOfS2(string1, string2) != -1) {
console.log("String1 is present in String2 as a substring.");
} else {
console.log("String 1 is not present in String2 as a substring.");
}
输出
String1 is present in String2 as a substring.
时间复杂度 - O(n),与indexOf()方法的时间复杂度相同。
空间复杂度 - O(1),与indexOf()方法的空间复杂度相同。
方法3
在这种方法中,我们将使用includes()方法来检查string2是否包含string1。如果string2存在于string1中,includes()方法将返回true。否则,返回false。
示例
在这个示例中,如果includes()方法返回true,我们从S1isSubOfS2()函数返回1。否则,返回-1。
function S1isSubOfS2(alpha1, alpha2) {
// Using the includes() method
if (alpha2.includes(alpha1)) {
return 1;
}
return -1;
}
var string1 = "acd";
var string2 = "efadef";
if (S1isSubOfS2(string1, string2) != -1) {
console.log("String1 is present in String2 as a substring.");
} else {
console.log("String 1 is not present in String2 as a substring.");
}
输出
String 1 is not present in String2 as a substring.
时间复杂度: O(n)与includes()方法的时间复杂度相同。
空间复杂度: O(1),与includes()方法的空间复杂度相同。
方法4
在第四种方法中,我们将使用JavaScript的match()方法。match()方法用于在特定字符串中搜索特定模式,接受一个字符串或正则表达式作为参数。如果匹配未找到,则返回null。否则,返回包含所有匹配项的数组。
示例
在此示例中,我们通过将alpha1字符串作为参数传递给match()方法来执行匹配()方法。如果找到匹配项,则返回匹配的索引。否则,返回-1。
function S1isSubOfS2(alpha1, alpha2) {
// Using the match() method
var result = alpha2.match(alpha1);
if (result != null) {
return result.index;
}
return -1;
}
var string1 = "acd";
var string2 = "efacdef";
if (S1isSubOfS2(string1, string2) != -1) {
console.log("String1 is present in String2 as a substring.");
} else {
console.log("String 1 is not present in String2 as a substring.");
}
输出
String1 is present in String2 as a substring.
时间复杂度 − O(n)
空间复杂度 − O(1)
我们学习了四种方法来解决在字符串2中找到字符串1作为子字符串的问题。第一种方法是朴素方法,它的时间复杂度比其他方法高。在JavaScript中,最好使用内置方法,因为它们比朴素方法更优化,并且它们可以用来提高性能。