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++
#include <bits/stdc++.h>
using namespace std;
int isSubstring(string s1, string s2)
{
int M = s1.length();
int N = s2.length();
for ( int i = 0; i <= N - M; i++) {
int j;
for (j = 0; j < M; j++)
if (s2[i + j] != s1[j])
break ;
if (j == M)
return i;
}
return -1;
}
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
class GFG {
static int isSubstring(
String s1, String s2)
{
int M = s1.length();
int N = s2.length();
for ( int i = 0 ; i <= N - M; i++) {
int j;
for (j = 0 ; j < M; j++)
if (s2.charAt(i + j)
!= s1.charAt(j))
break ;
if (j == M)
return i;
}
return - 1 ;
}
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);
}
}
|
Python3
def isSubstring(s1, s2):
M = len (s1)
N = len (s2)
for i in range (N - M + 1 ):
for j in range (M):
if (s2[i + j] ! = s1[j]):
break
if j + 1 = = M :
return i
return - 1
if __name__ = = "__main__" :
s1 = "for"
s2 = "geeksforgeeks"
res = isSubstring(s1, s2)
if res = = - 1 :
print ( "Not present" )
else :
print ( "Present at index " + str (res))
|
C#
using System;
class GFG {
static int isSubstring( string s1, string s2)
{
int M = s1.Length;
int N = s2.Length;
for ( int i = 0; i <= N - M; i++) {
int j;
for (j = 0; j < M; j++)
if (s2[i + j] != s1[j])
break ;
if (j == M)
return i;
}
return -1;
}
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);
}
}
|
PHP
<?php
function isSubstring( $s1 , $s2 )
{
$M = strlen ( $s1 );
$N = strlen ( $s2 );
for ( $i = 0; $i <= $N - $M ; $i ++)
{
$j = 0;
for (; $j < $M ; $j ++)
if ( $s2 [ $i + $j ] != $s1 [ $j ])
break ;
if ( $j == $M )
return $i ;
}
return -1;
}
$s1 = "for" ;
$s2 = "geeksforgeeks" ;
$res = isSubstring( $s1 , $s2 );
if ( $res == -1)
echo "Not present" ;
else
echo "Present at index " . $res ;
?>
|
Javascript
<script>
function isSubstring(s1, s2)
{
var M = s1.length;
var N = s2.length;
for ( var i = 0; i <= N - M; i++) {
var j;
for (j = 0; j < M; j++)
if (s2[i + j] != s1[j])
break ;
if (j == M)
return i;
}
return -1;
}
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>
|
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.
C++
#include <bits/stdc++.h>
using namespace std;
int Substr(string s2, string s1)
{
int counter = 0;
int i = 0;
for (;i<s1.length();i++)
{
if (counter==s2.length())
break ;
if (s2[counter]==s1[i])
{
counter++;
}
else
{
if (counter > 0)
{
i -= counter;
}
counter = 0;
}
}
return counter < s2.length()?-1:i-counter;
}
int main()
{
string s1 = "geeksfffffoorrfoorforgeeks" ;
cout << Substr( "for" , s1);
return 0;
}
|
Java
import java.io.*;
class GFG {
public static int Substr(String s2, String s1){
int counter = 0 ;
int i = 0 ;
for (;i<s1.length();i++){
if (counter==s2.length())
break ;
if (s2.charAt(counter)==s1.charAt(i)){
counter++;
} else {
if (counter> 0 ){
i -= counter;
}
counter = 0 ;
}
}
return counter < s2.length()?- 1 :i-counter;
}
public static void main (String[] args) {
String s1 = "geeksfffffoorrfoorforgeeks" ;
System.out.println(Substr( "for" , s1));
}
}
|
Python3
def Substr( Str , target):
t = 0
Len = len ( Str )
i = 0
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)
print (Substr( "GeeksForGeeks" , "Fr" ))
print (Substr( "GeeksForGeeks" , "For" ))
|
C#
using System;
class GFG {
static int Substr( string s2, string s1)
{
int counter = 0;
int i = 0;
for (; i < s1.Length; i++) {
if (counter == s2.Length)
break ;
if (s2[counter] == s1[i]) {
counter++;
}
else {
if (counter > 0) {
i -= counter;
}
counter = 0;
}
}
return counter < s2.Length ? -1 : i - counter;
}
public static int Main()
{
string s1 = "geeksfffffoorrfoorforgeeks" ;
Console.Write(Substr( "for" , s1));
return 0;
}
}
|
Javascript
<!-- Javascript program for the above approach -->
<script>
function Substr( s2, s1){
var counter = 0;
var i = 0;
for ( ;i < s1.length; i++)
{
if ( counter == s2.length )
{
break ;
}
if ( s2[counter] == s1[i] )
{
counter++;
}
else
{
if (counter > 0)
{
i -= counter;
}
counter = 0;
}
}
return counter < s2.length ? -1 : i-counter;
}
var s1 = "geeksfffffoorrfoorforgeeks" ;
document.write(Substr( "for" , s1));
</script>
<!-- this code is contributed by Nirajgusain5 -->
|
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).