package com.interview.algorithms.string;
import com.interview.basics.model.trie.Trie;
import com.interview.basics.search.ASearcher;
import java.util.ArrayList;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-10-9
* Time: 下午2:42
*/
class WordState implements ASearcher.State<String> {
String s;
WordState(String s) {
this.s = s;
}
@Override
public String key() {
return s;
}
}
public class C11_30_WordTranslation extends ASearcher<String, WordState, String> {
public final static String DICTIONARY = "./documents/dictionary";
Trie trie;
public C11_30_WordTranslation(String s) {
super(s);
trie = Trie.loadDictionary(DICTIONARY);
}
@Override
protected double heuristicEstimateDistance(WordState c, WordState t) {
double diff = 0.0;
for(int i = 0; i < c.s.length(); i++) {
if(c.s.charAt(i) != t.s.charAt(i)) diff++;
}
return diff;
}
@Override
protected boolean isSame(WordState c, WordState t) {
return c.s.equals(t.s);
}
@Override
protected WordState[] nextState(WordState wordState) {
List<WordState> states = new ArrayList<>();
char[] chars = wordState.s.toCharArray();
for(int i = 0; i < chars.length; i++){
char ch = chars[i];
for(int j = 0; j < 26; j++){
if('a' + j != ch) {
chars[i] = (char)('a' + j);
String w = String.copyValueOf(chars);
if(trie.isWord(w)) states.add(new WordState(w));
}
}
chars[i] = ch;
}
return states.toArray(new WordState[states.size()]);
}
@Override
protected double gScore(Candidate c, WordState t) {
return gScore.get(c.state.key()) + 1;
}
public Iterable<String> solve(String s, String t){
WordState source = new WordState(s);
WordState target = new WordState(t);
Path<String> path = this.pathTo(source, target);
return path.path;
}
}