JavaScript程式:檢查字串是否為另一個字串的子串
在這個問題中,我們需要確保字串String2是否包含字串String1作為子串。
我們將首先看到解決問題的簡單方法,在String2中查詢與String1匹配的所有長度與String1相同的子串。此外,我們將使用內建方法,如match()、includes()和indexOf()方法來查詢String2中的String1子串。
問題陳述 - 我們給定兩個不同大小的字串String1和String2。我們需要檢查字串String1是否作為子串存在於字串String2中。
示例
輸入
string1 = "tutor"; string2 = "pointtutorial";
輸出
Yes
說明 - 它列印“yes”,因為字串1作為子串存在於字串2中。
輸入
string1 = "cde"; string2 = "pointtutorial";
輸出
No
說明 - 它列印“No”,因為字串1不存在於字串2中。
輸入
string1 = "trsedf"; string2 = "rtel";
輸出
No
說明 - 它列印“No”,因為字串2的長度小於字串1。
方法1
在這種方法中,我們將查詢所有長度等於字串1長度的子串。之後,我們將它與字串1進行匹配,如果它們相等,我們可以說字串2包含字串1作為子串。
演算法
步驟1 - 定義len1和len2變數,並分別用字串1和字串2的長度初始化它們。
步驟2 - 從字串2的第0個索引到(len2 – len1)個索引開始遍歷字串2。
步驟3 - 使用巢狀迴圈,進行len1次迭代。
步驟4 - 如果string2[p + q] != string1[q]為真,則中斷迴圈。
步驟5 - 迴圈迭代之後,如果q == len1,則巢狀迴圈已完成總共len1次迭代,因為字串1作為子串存在。返回p。
步驟6 - 最後返回-1。
示例
這裡將alpha2[p+q]與alpha[q]匹配的目的是將從字串2中p索引開始的子串與字串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字串作為引數傳遞。如果在alpha2中找不到alpha1,則返回-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()方法來檢查字串2是否包含字串1。如果字串2存在於字串1中,則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中,最好使用內建方法,因為它們比簡單方法更最佳化,並且可以提高效能。