Salve a tutti...Potreste darmi una mano col seguente problema? è un pomeriggio che ci sto sbattendo la testa!

E' un programma che calcola la derivata di un polinomio, tipo ax^(2) + bx + c : l'input è esattamente così come ho postato, spazi compresi.
L'output generato dovrebbe essere a*2x + b

Per chi non si ricorda, posto la regola generale delle derivate XD Su un polinomio generico ax^(n) + bx^(n-1) + c
la derivata è a*n*x^(n-1) + b*(n-1)*x^(n-2) ... le costanti come c non hanno derivata!

Il mio problema è proprio questo, ovvero nel mio output rimane uno "spazio voto" al posto dello zero diciamo, ma viene postato anche l'operatore! Esempio

codice:
Input: 4x^2 + 4x + 4
Output: 8x + 4 +
Vi posto il mio codice

codice:
import java.io.*;
import java.util.*;

public class Derivata {

	public static void main( String [] args ) throws IOException {
	
		BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
		String operatore, monomio, s = in.readLine();
		StringTokenizer stk = new StringTokenizer( s );
		StringBuilder b = new StringBuilder();
		
		while( stk.hasMoreTokens() ) {
				
	        	monomio = stk.nextToken();
			int N = monomio.length();
			char iniz = monomio.charAt(0);
					
			// caso in cui il parametro è nullo
			if( iniz == 0 ) break;
										
  			// caso in cui è l'operatore
			if( !Character.isLetterOrDigit( iniz ) )
			    b.append(monomio + " ");

					
			for( int i = 0; i < N; i++ ) {
							
			    char x = monomio.charAt( i );
														
			    // caso "ordinario"
			    if( Character.isLetter( x ) ) {
			    // se l'incognita è di grado uno ( tipo ax ), non stamparla
			    if( i == N-1 ) {
			        int a = Integer.parseInt( monomio.substring( 0, i ) );
				b.append(a + " ");
			    }
			     // altrimenti continua col regolare caso ordinario
                             else {
			        int n = Integer.parseInt( monomio.substring( i+2 ) );
				int a = Integer.parseInt( monomio.substring( 0, i ) );
				int pref = a*n;
				int esp = n-1;
				if( esp == 1 ) b.append(pref + "" + x + " ");
				else b.append(pref + "" + x + "^" + esp + " ");
			     }
       			}
						
	           }	
				
		}
		System.out.println(b);
	}

}
Il mio problema è che non riesco a capire come verificare se il token che sto esaminando non ha un incognita, e di conseguenza la sua derivata è zero o meno...Quindi mi rimane"un buco" nell'output

Qualcuno mi può dare una mano??? Per Favore! Help...grazie