Given two strings S1 and S2, The task is to 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= “neveropen”
Output: 5
Explanation: String “for” is present as a substring of s2.Input: S1 = “practice”, S2= “neveropen”
Output: -1.
Explanation: There is no occurrence of “practice” in “neveropen”
Naive Approach: Below is the idea to solve the problem.
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-strings starting from every index.
Follow the steps below to implement the idea:
- Run a for loop with counter i from 0 to N – M.
- Run a for loop with counter j from 0 to M-1.
- Compare jth character of S1 with (i+j)th character of S2.
- If the loop terminates after matching all the characters, then return i, i.e. substring S1 is found starting from ith character of S2
- Run a for loop with counter j from 0 to M-1.
- Return -1 as no substring is found.
Below is the Implementation of the above idea.
C
// C program to check if a string is // substring of other. #include <stdio.h> #include <string.h> // Returns true if s1 is substring of s2 int isSubstring( char * s1, char * s2) { int M = strlen (s1); int N = strlen (s2); /* 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() { char s1[] = "for" ; char s2[] = "neveropen" ; int res = isSubstring(s1, s2); if (res == -1) printf ( "Not present" ); else printf ( "Present at index %d" , res); return 0; } |
C++
// 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 s2 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 */ int main() { string s1 = "for" ; string s2 = "neveropen" ; int res = isSubstring(s1, s2); if (res == -1) cout << "Not present" ; else cout << "Present at index " << res; return 0; } |
Java
// 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 = "neveropen" ; 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
# Python3 program to check if # a string is substring of other. # Returns true if s1 is substring of s2 def 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 Code if __name__ = = "__main__" : s1 = "for" s2 = "neveropen" res = isSubstring(s1, s2) if res = = - 1 : print ( "Not present" ) else : print ( "Present at index " + str (res)) # This code is contributed by ChitraNayal |
C#
// 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 = "neveropen" ; 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 // PHP program to check if a // string is substring of other. // Returns true if s1 is substring of s2 function 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 = "neveropen" ; $res = isSubstring( $s1 , $s2 ); if ( $res == -1) echo "Not present" ; else echo "Present at index " . $res ; // This code is contributed by mits ?> |
Javascript
<script> // JavaScript program to check if a string is // substring of other. // Returns true if s1 is substring of s2 function 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 = "neveropen" ; var res = isSubstring(s1, s2); if (res == -1) document.write( "Not present" ); else document.write( "Present at index " + res); </script> |
Present at index 5
Time complexity: O(M * N) where m and n are lengths of s1 and s2 respectively, Nested loops are used, outer from 0 to N – M and inner from 0 to M
Auxiliary Space: O(1), As no extra space is required.
Check if a string is a substring of another using STL:
std::find from C++ STL, the index method in Python, the indexOf method in Java, the indexOf method in JavaScript are some inbuilt functions in the libraries of respective languages for finding the starting index of a substring in a given string.
Below is the Implementation of above approach.
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // function to get the index of s2 in s1 int 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 code int main() { string s1 = "for" ; string s2 = "neveropen" ; // 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
# Python3 program to check if # a string is substring of other. # Checks if s1 is a substring of s2 def isSubstring(s1, s2): if s1 in s2: return s2.index(s1) return - 1 # Driver Code if __name__ = = "__main__" : s1 = "for" s2 = "neveropen" res = isSubstring(s1, s2) if res = = - 1 : print ( "Not present" ) else : print ( "Present at index " + str (res)) # This code is contributed by phasing17 |
Java
// 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 = "neveropen" ; // 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 |
C#
// 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 = "neveropen" ; // 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 |
Javascript
//JS program to implement the approach // function to get the index of s2 in s1 function isSubstring(s1, s2) { // using indexOf method to check if s1 is // a substring of s2 return s2.indexOf(s1); } // Driver code var s1 = "for" ; var s2 = "neveropen" ; //Function Call var res = isSubstring(s1, s2); if (res == -1) console.log( "Not present" ); else console.log( "Present at index " + res); // this code is contributed by phasing17 |
Present at index 5
Time Complexity: O(N) , where N is the length of the longer string s2
Auxiliary space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!