private static void editDistanceTraceBackHelper(String s1, String s2, short[][] arrowTable, int x, int y, String sb1, String sb2, Set<StringMatch> result, int maxChange, int currentChange){
		if(x==0 && y==0){
			if(currentChange==maxChange)
				result.add(new StringMatch(reverse(sb1),reverse(sb2), maxChange));
			return;
		}
		if((arrowTable[x][y]&(1<<UP))>0){//deletion
			editDistanceTraceBackHelper(s1, s2, arrowTable, x-1,y, sb1+s1.charAt(x),sb2+"-", result, maxChange, currentChange+1);
		}
		if((arrowTable[x][y]&(1<<LEFT))>0){//insertion
			editDistanceTraceBackHelper(s1, s2, arrowTable, x,y-1, sb1+"-",sb2+s2.charAt(y), result, maxChange, currentChange+1);
		}
		if((arrowTable[x][y]&(1<<DIAGNAL))>0){
			if(s1.charAt(x)==s2.charAt(y)){//match
				editDistanceTraceBackHelper(s1, s2, arrowTable, x-1, y-1, sb1+s1.charAt(x), sb2+s2.charAt(y), result, maxChange, currentChange);
			}else{//substitution
				editDistanceTraceBackHelper(s1, s2, arrowTable, x-1, y-1, sb1+s1.charAt(x), sb2+s2.charAt(y), result, maxChange, currentChange+1);
			}
		}
	}