I was working on the challenge Save Humanity from Interviewstreet for a while then gave up, solved a few other challenges, and have come back to it again.
The code below generates the correct answers but the time complexity O(text * pattern)
is not sufficient for the auto-grader. Could anyone perhaps give me a hint or a pointer on how to improve my algorithm?
final BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
final StringBuilder builder = new StringBuilder();
final int number_trials = Integer.valueOf(input.readLine());
for(int trial = 0; trial < number_trials; trial++)
{
final int allowed_mismatches = 1;
final char[] text = input.readLine().toCharArray();
final char[] pattern = input.readLine().toCharArray();
input.readLine();
for(int text_index = 0; text_index < text.length - pattern.length + 1; text_index++)
{
int pattern_index = 0;
int missed = 0;
while(pattern_index < pattern.length && missed <= allowed_mismatches)
{
if(text[text_index + pattern_index] != pattern[pattern_index])
{
missed++;
}
pattern_index++;
}
if(missed <= allowed_mismatches)
{
builder.append(text_index);
builder.append(" ");
}
}
if(builder.length() > 0 && builder.charAt(builder.length() - 1) == ' ')
{
builder.deleteCharAt(builder.length() - 1);
}
if(trial + 1 < number_trials)
{
builder.append("\n");
}
}
System.out.println(builder.toString());