已知一些文字对应的拼音及其在数据库中对应的概率,在给定一段有序的拼音串时,求解其最有可能表示的意思,并给出对应的概率值!
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class Main {
static HashMap<String, Float> dict = new HashMap<String, Float>();
static {
dict.put("fu", 0.1242f);
dict.put("tao", 0.1212f);
dict.put("peng", 0.23f);
dict.put("ge", 0.143f);
dict.put("e",0.77f);
dict.put("ta",0.37f);
dict.put("o",0.47f);
}
private static float findMaxProbabilityString(char[] cdata, int start, int end, ArrayList<String> al) {
if(start <= end) {
ArrayList<String> l = new ArrayList<String>();
for(int i=1; i<=6 && start+i-1<cdata.length ; i++) {
String tmp = new String(cdata,start,i);
if(dict.containsKey(tmp))
l.add(tmp);
}
int numInDict = l.size();
float maxRate = 0.0f;
int position = 0;
if( numInDict != 0) {
float[] keyToFloat = new float[numInDict];
for(int j=0; j<numInDict; j++) {
keyToFloat[j] = dict.get(l.get(j)) * findMaxProbabilityString(cdata,start+l.get(j).length(),end,al);
if(keyToFloat[j] > maxRate) {
maxRate = keyToFloat[j];
position = j;
}
}
al.add(l.get(position));
}
return maxRate;
}
return 1;
}
public static void main(String[] args) {
/*
Set<Entry<String,Float>> es = dict.entrySet();
for(Entry<String,Float> e : es)
System.out.println(e.getKey()+":"+e.getValue());
*/
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String data = sc.nextLine();
char[] cdata = data.toCharArray();
ArrayList<String> al = new ArrayList<String>();
float result = findMaxProbabilityString(cdata,0,cdata.length-1,al);
//need to reverse
for(String l : al)
System.out.println(l);
System.out.println(result);
}
}
}