Leetcode 399. Evaluate Division
"a"-(2)->"b"
"b"-(1/2)-->"a"-(3)->"c"
深度优先搜索:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class Solution {
public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
HashMap<String,ArrayList<String>> pairs = new HashMap<String,ArrayList<String>>();
HashMap<String,ArrayList<Double>> pairValues = new HashMap<String,ArrayList<Double>>();
double[] results = new double[queries.length];
for(int i=0;i<equations.length;i++){
String[] equation = equations[i];
if(!pairs.containsKey(equation[0])){
pairs.put(equation[0], new ArrayList<String>());
pairValues.put(equation[0], new ArrayList<Double>());
}
if(!pairs.containsKey(equation[1])){
pairs.put(equation[1], new ArrayList<String>());
pairValues.put(equation[1], new ArrayList<Double>());
}
pairs.get(equation[0]).add(equation[1]);
pairValues.get(equation[0]).add(values[i]);
pairs.get(equation[1]).add(equation[0]);
pairValues.get(equation[1]).add(1/values[i]);
}
for(int i=0;i<queries.length;i++){
String start = queries[i][0],end = queries[i][1];
results[i] = dfs(start,end,pairs,pairValues,new ArrayList<String>(),1);
if(results[i]==0.0) results[i] = -1.0;
}
return results;
}
private double dfs(String start, String end, HashMap<String, ArrayList<String>> pairs,
HashMap<String, ArrayList<Double>> pairValues, ArrayList<String> tmp,double value) {
// TODO Auto-generated method stub
if(tmp.contains(start)) return value;
if(!pairs.containsKey(start)) return 0.0;
tmp.add(start);
double res = 0.0;
for(int i=0;i<pairs.get(start).size();i++){
String next = pairs.get(start).get(i);
res = dfs(next,end,pairs,pairValues,tmp,value*pairValues.get(start).get(i));
if(res!=0.0){
break;
}
}
tmp.remove(start);
return res;
}
}