Check if a string is substring of another

02 Jun, 2022
Given two strings s1 and s2, find if s1 is a substring of s2. If yes, return the index of the first occurrence, else return -1.
Examples : 
Input: s1 = “for”, s2 = “geeksforgeeks”Output: 5Explanation: String “for” is present as a substring of s2.
Input: s1 = “practice”, s2 = “geeksforgeeks”Output: -1.Explanation: There is no occurrence of “practice” in “geeksforgeeks”
Simple Approach: The idea is to run a loop from start to end and for every index in the given string check whether the sub-string can be formed from that index. This can be done by running a nested loop traversing the given string and in that loop running another loop checking for sub-string from every index. For example, consider there to be a string of length N and a substring of length M. Then run a nested loop, where the outer loop runs from 0 to (N-M) and the inner loop from 0 to M. For very index check if the sub-string traversed by the inner loop is the given sub-string or not. 
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
C++
Java
Python3
C#
PHP
Javascript
// C++ program to check if a string is// substring of other.#include <bits/stdc++.h>using namespace std; // Returns true if s1 is substring of s2int isSubstring(string s1, string s2){    int M = s1.length();    int N = s2.length();     /* A loop to slide pat[] one by one */    for (int i = 0; i <= N - M; i++) {        int j;         /* For current index i, check for pattern match */        for (j = 0; j < M; j++)            if (s2[i + j] != s1[j])                break;         if (j == M)            return i;    }     return -1;} /* Driver code */int main(){    string s1 = "for";    string s2 = "geeksforgeeks";    int res = isSubstring(s1, s2);    if (res == -1)        cout << "Not present";    else        cout << "Present at index " << res;    return 0;}
// Java program to check if a string is// substring of other.class GFG {     // Returns true if s1 is substring of s2    static int isSubstring(        String s1, String s2)    {        int M = s1.length();        int N = s2.length();         /* A loop to slide pat[] one by one */        for (int i = 0; i <= N - M; i++) {            int j;             /* For current index i, check for            pattern match */            for (j = 0; j < M; j++)                if (s2.charAt(i + j)                    != s1.charAt(j))                    break;             if (j == M)                return i;        }         return -1;    }     /* Driver code */    public static void main(String args[])    {        String s1 = "for";        String s2 = "geeksforgeeks";         int res = isSubstring(s1, s2);         if (res == -1)            System.out.println("Not present");        else            System.out.println(                "Present at index "                + res);    }} // This code is contributed by JaideepPyne.
# Python3 program to check if# a string is substring of other. # Returns true if s1 is substring of s2def isSubstring(s1, s2):    M = len(s1)    N = len(s2)     # A loop to slide pat[] one by one    for i in range(N - M + 1):         # For current index i,        # check for pattern match        for j in range(M):            if (s2[i + j] != s1[j]):                break                     if j + 1 == M :            return i     return -1 # Driver Codeif __name__ == "__main__":    s1 = "for"    s2 = "geeksforgeeks"    res = isSubstring(s1, s2)    if res == -1 :        print("Not present")    else:        print("Present at index " + str(res)) # This code is contributed by ChitraNayal
// C# program to check if a string is// substring of other.using System;class GFG {     // Returns true if s1 is substring of s2    static int isSubstring(string s1, string s2)    {        int M = s1.Length;        int N = s2.Length;         /* A loop to slide pat[] one by one */        for (int i = 0; i <= N - M; i++) {            int j;             /* For current index i, check for            pattern match */            for (j = 0; j < M; j++)                if (s2[i + j] != s1[j])                    break;             if (j == M)                return i;        }         return -1;    }     /* Driver code */    public static void Main()    {        string s1 = "for";        string s2 = "geeksforgeeks";         int res = isSubstring(s1, s2);         if (res == -1)            Console.Write("Not present");        else            Console.Write("Present at index "                          + res);    }} // This code is contributed by nitin mittal.
<?php// PHP program to check if a// string is substring of other. // Returns true if s1 is substring of s2function isSubstring($s1, $s2){    $M = strlen($s1);    $N = strlen($s2);     // A loop to slide    // pat[] one by one    for ($i = 0; $i <= $N - $M; $i++)    {        $j = 0;         // For current index i,        // check for pattern match        for (; $j < $M; $j++)            if ($s2[$i + $j] != $s1[$j])                break;         if ($j == $M)            return $i;    }     return -1;} // Driver Code$s1 = "for";$s2 = "geeksforgeeks";$res = isSubstring($s1, $s2);if ($res == -1)    echo "Not present";else    echo "Present at index " . $res; // This code is contributed by mits?>
<script> // JavaScript program to check if a string is// substring of other. // Returns true if s1 is substring of s2function isSubstring(s1, s2){    var M = s1.length;    var N = s2.length;     /* A loop to slide pat[] one by one */    for (var i = 0; i <= N - M; i++) {        var j;         /* For current index i, check for pattern match */        for (j = 0; j < M; j++)            if (s2[i + j] != s1[j])                break;         if (j == M)            return i;    }     return -1;} /* Driver code */var s1 = "for";var s2 = "geeksforgeeks";var res = isSubstring(s1, s2);if (res == -1)    document.write( "Not present");else    document.write( "Present at index " + res); </script>
Present at index 5
Complexity Analysis: 
Time complexity: O(m * n) where m and n are lengths of s1 and s2 respectively. A nested loop is used the outer loop runs from 0 to N-M and the inner loop from 0 to M so the complexity is O(m*n).
Space Complexity: O(1). As no extra space is required.
An efficient solution is to use a O(n) searching algorithm like KMP algorithm, Z algorithm, etc.Language implementations: 
Java Substring
substr in C++
Python find
Another Efficient Solution: 
An efficient solution would need only one traversal i.e. O(n) on the longer string s1. Here we will start traversing the string s1 and maintain a pointer for string s2 from 0th index.
For each iteration, we compare the current character in s1 and check it with the pointer at s2.
If they match we increment the pointer on s2 by 1. And for every mismatch, we set the pointer back to 0.
Also keep a check when the s2 pointer value is equal to the length of string s2, if true we break and return the value (pointer of string s1 – pointer of string s2)
Works with strings containing duplicate characters.
C++
Java
Python3
C#
Javascript
#include <bits/stdc++.h>using namespace std; int Substr(string s2, string s1){    int counter = 0; // pointing s2    int i = 0;    for(;i<s1.length();i++)    {        if(counter==s2.length())            break;        if(s2[counter]==s1[i])        {            counter++;        }      else        {            // Special case where character preceding the i'th character is duplicate            if(counter > 0)            {                i -= counter;            }            counter = 0;        }    }    return counter < s2.length()?-1:i-counter;} // Driver codeint main(){    string s1 = "geeksforgeeks";    cout << Substr("for", s1);    return 0;} // this code is contributed by Manu Pathria
import java.io.*; class GFG {   public static int Substr(String s2, String s1){        int counter = 0; //pointing s2        int i = 0;        for(;i<s1.length();i++){            if(counter==s2.length())                break;            if(s2.charAt(counter)==s1.charAt(i)){                counter++;            }else{                //Special case where character preceding the i'th character is duplicate                if(counter>0){                    i -= counter;                }                counter = 0;            }        }        return counter < s2.length()?-1:i-counter;    }    public static void main (String[] args) {        String s1 = "geeksforgeeks";        //System.out.println(s2.indexOf("for"));        System.out.println(Substr("for", s1));    }}
# Python program for the above approachdef Substr(s1, s2):     counter = 0    i = 0    Len = len(s1)     while(i < Len):        if(counter == len(s2)):            break;        if(s2[counter] == s1[i]):          counter += 1        else:          if(counter > 0):            i -= counter          counter = 0        i += 1     if (counter < len(s2)):      return -1    else:      return (i - counter)  # Driver codeprint(Substr("geeksforgeeks", "for")) # This code is contributed by avanitrachhadiya2155
//  C# program for the above approachusing System;class GFG {  static int Substr(string s2, string s1)  {    int counter = 0; // pointing s2    int i = 0;    for (; i < s1.Length; i++) {      if (counter == s2.Length)        break;      if (s2[counter] == s1[i]) {        counter++;      }      else {         // Special case where character preceding        // the i'th character is duplicate        if (counter > 0) {          i -= counter;        }        counter = 0;      }    }    return counter < s2.Length ? -1 : i - counter;  }   // Driver code  public static int Main()  {    string s1 = "geeksforgeeks";    Console.Write(Substr("for", s1));    return 0;  }} // This code is contributed by Taranpreet
<!-- Javascript program for the above approach --> <script>   function Substr( s2,  s1){        var counter = 0; // pointing s2    var i = 0;    for( ;i < s1.length; i++)    {        if( counter == s2.length )        {            break;        }        if( s2[counter] == s1[i] )        {            counter++;        }      else        {            // Special case where character preceding            // the i'th character is duplicate            if(counter > 0)            {                i -= counter;            }            counter = 0;        }    }        return counter < s2.length ? -1 : i-counter;}   // Driver code var s1 = "geeksforgeeks"; document.write(Substr("for", s1));  </script> <!-- this code is contributed by Nirajgusain5 -->
5
Complexity Analysis:The complexity of the above code will be still O(n*m) in the worst case and the space complexity is O(1).
Using Library MethodsModern programming languages typically have inbuilt library methods that check if one string is present in another, and the index at which it is located. For instance, the std::find from C++ STL, the index method in Python, the indexOf method in Java, the indexOf method in JavaScript.
C++
Python3
Java
Javascript
C#
//C++ implementation of the approach #include <bits/stdc++.h>using namespace std; // function to get the index of s2 in s1int isSubstring(string s1, string s2){    // using find method to check if s1 is    // a substring of s2    if (s2.find(s1) != string::npos)        return s2.find(s1);    return -1;} // Driver codeint main(){    string s1 = "for";    string s2 = "geeksforgeeks";         //Function Call    int res = isSubstring(s1, s2);    if (res == -1)        cout << "Not present";    else        cout << "Present at index " << res;    return 0;} // this code is contributed by phasing17
# Python3 program to check if# a string is substring of other. # Checks if s1 is a substring of s2def isSubstring(s1, s2):    if s1 in s2:      return s2.index(s1)    return -1 # Driver Codeif __name__ == "__main__":    s1 = "for"    s2 = "geeksforgeeks"    res = isSubstring(s1, s2)    if res == -1 :        print("Not present")    else:        print("Present at index " + str(res)) # This code is contributed by phasing17
//Java program to implement the approach class GFG {    // function to get the index of s2 in s1    static int isSubstring(String s1, String s2)    {        // using indexOf method to check if s1 is        // a substring of s2        return s2.indexOf(s1);    }    public static void main(String[] args) {        String s1 = "for";        String s2 = "geeksforgeeks";                 //Function Call        int res = isSubstring(s1, s2);        if (res == -1)            System.out.println("Not present");        else            System.out.println("Present at index " + res);    }} //this code is contributed by phasing17
//JS program to implement the approach // function to get the index of s2 in s1function isSubstring(s1, s2){    // using indexOf method to check if s1 is    // a substring of s2    return s2.indexOf(s1);} // Driver codevar s1 = "for";var s2 = "geeksforgeeks";   //Function Callvar res = isSubstring(s1, s2);if (res == -1)    console.log("Not present");else    console.log("Present at index " + res);  // this code is contributed by phasing17
// C# program to implement the approach using System; public class GFG {    // function to get the index of s2 in s1    static int isSubstring(string s1, string s2)    {        // using IndexOf method to check if s1 is        // a substring of s2        return s2.IndexOf(s1);    }    public static void Main(string[] args)    {        string s1 = "for";        string s2 = "geeksforgeeks";         // Function Call        int res = isSubstring(s1, s2);        if (res == -1)            Console.WriteLine("Not present");        else            Console.WriteLine("Present at index " + res);    }} // this code is contributed by phasing17
Present at index 5
jaideeppyne1997
nitin mittal
Mithun Kumar
ukasp
amogha_ha
andrew1234
ssj256x
avanitrachhadiya2155
ravipatiaditya
devaxdu
manupathria
rrrtnx
janmanshh
nirajgusain5
darshantripathi909
akshaykhodade
singhh3010
phasing17
Pattern Searching
Strings
Strings
Pattern Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Split the binary string into substrings with equal number of 0s and 1s
Manacher's Algorithm - Linear Time Longest Palindromic Substring - Part 1
Check if a string contains uppercase, lowercase, special characters and numeric values
Reverse the substrings of the given String according to the given Array of indices
Remove leading zeros from a Number given as a string
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Different Methods to Reverse a String in C++