Soluzione 4.3

Ecco una possibile soluzione. Leggere con attenzione i commenti per capire come funziona l'algoritmo realizzato nel metodo stringMatch
import java.util.Scanner;

public class SubstringTester
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.println("Inserire la prima stringa");
        String s1 = in.nextLine();
        System.out.println("Inserire la seconda stringa");
        String s2 = in.nextLine();

        int index = stringMatch(s1,s2); //cfr. il metodo stringMatch sotto
        if (index >=0)
            System.out.println("E` una sottostringa: dal carattere " + index);
        else
            System.out.println("Non e` una sottostringa");
    }



    /*
      Questo metodo verifica se s2 e` una sottostringa di s1. In caso positivo
      restituisce l'indice iniziale della sottostringa di s1 che coincide con
      s2, altrimenti restituisce il valore -1

      L'algoritmo realizzato in questo metodo ragiona cosi`: confrontiamo s2 
      con la sottostringa di s1 che comincia all'indice i1 (e che e` lunga come
      s2). Se coincidono allora s2 e` una sottostringa di s1, altrimenti si     
      incrementa i1 e si riprova a fare il confronto.
    */

    public static int stringMatch(String s1, String s2)
    {
        /*
          Usiamo due variabili int, i1, e i2, che "puntano" ai caratteri
          di s1 ed s2, rispettivamente
          Osservare il valore massimo assunto da i1: non ha senso cercare
          in s1 a partire da una posizione in cui il numero di caratteri
          successivi e' minore del numero di caratteri presenti in s2
        */	
        for (int i1 = 0; i1 <= s1.length() - s2.length(); i1++ )
        {
            /*
                se potessimo usare tutti i metodi di String, potremmo estrarre
                da s1 la sottostringa che inizia in posizione i1 e che ha
                lunghezza uguale a quella di s2:

                String maybeSub = s1.substring(i1, i1+s2.length());
                if (maybeSub.equals(s2))
                    return i1;

                Senza usare tali metodi, realizziamo lo stesso algoritmo
            */

            int i2=0;
            while (i2 < s2.length() && s1.charAt(i1+i2) == s2.charAt(i2) )
                i2++;
            if (i2 == s2.length())
                return i1;
        }
        return -1;
    }
}