Related Articles
Check if a string is substring of another
• Difficulty Level : Medium
• Last Updated : 03 May, 2021

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: 5
Explanation:
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 run 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.

## C++

 `// C++ program to check if a string is``// substring of other.``#include ``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 = ``"geeksforgeeks"``;``    ``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 = ``"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

 `# 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 ``=` `"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#

 `// 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

 ``
Output
`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 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:

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.

## Java

 `import` `java.io.*;` `class` `GFG {``   ``public` `static` `int` `strstr(String s2, String s1){``        ``int` `counter = ``0``; ``//pointing s2``        ``int` `i = ``0``;``        ``for``(;i``0``){``                    ``i -= counter;``                ``}``                ``counter = ``0``;``            ``}``        ``}``        ``return` `counter < s2.length()?-``1``:i-counter;``    ``}``    ``public` `static` `void` `main (String[] args) {``        ``String s1 = ``"geeksfffffoorrfoorforgeeks"``;``        ``//System.out.println(s2.indexOf("for"));``        ``System.out.println(strstr(``"for"``, s1));``    ``}``}`

## Python3

 `# Python program for the above approach``def` `strstr(``Str``, target):``    ` `    ``t ``=` `0``    ``Len` `=` `len``(``Str``)``    ``i ``=` `0``    ` `    ``# Iterate from 0 to Len - 1``    ``for` `i ``in` `range``(``Len``):``        ``if` `(t ``=``=` `len``(target)):``            ``break``        ``if` `(``Str``[i] ``=``=` `target[t]):``            ``t ``+``=` `1``        ``else``:``            ``t ``=` `0``            ` `    ``if` `(t < ``len``(target)):``        ``return` `-``1``    ``else``:``        ``return` `(i ``-` `t)` `# Driver code``print``(strstr(``"GeeksForGeeks"``, ``"Fr"``))``print``(strstr(``"GeeksForGeeks"``, ``"For"``))` `# This code is contributed by avanitrachhadiya2155`
Output
```-1
5```

Complexity Analysis:

Since we are traversing the first string 1 time so the order is O(n) and we are not allocating extra space to space complexity will be O(1)

My Personal Notes arrow_drop_up