题目描述:
现有一个字典,同时给定字典中的两个字符串s和t,给定一个变换,每次可以改变字符串中的任意一个字符,请设计一个算法,计算由s变换到t所需的最少步数,同时需要满足在变换过程中的每个串都是字典中的串。
给定一个string数组dic,同时给定数组大小n,串s和串t,请返回由s到t变换所需的最少步数。若无法变换到t则返回-1。保证字符串长度均小于等于10,且字典中字符串数量小于等于500。
测试样例:
[“abc”,”adc”,”bdc”,”aaa”],4,”abc”,”bdc”
返回:2
`
import java.util.*;
public class Change {
public static int countChanges(String[] dic, int n, String s, String t) {
// write code here
LinkedList<String> queue=new LinkedList<>();
HashSet<String> set=new HashSet<>();
for(int i=0;i<n;i++){
set.add(dic[i]);
}
queue.offer(s);
set.remove(s);
int steps=0;
while(true){
steps++;
int size=queue.size();
for(int i=0;i<size;i++){
String temp=queue.poll();
ArrayList<String> sons=getSon(temp,set);
for(String son:sons){
if(son.equals(t)){
return steps;
}
queue.offer(son);
set.remove(son);
}
}
if(queue.size()==0){
return -1;
}
}
}
private static ArrayList<String> getSon(String str, HashSet<String> set) {
// TODO Auto-generated method stub
ArrayList<String> res=new ArrayList<>();
for(String x:set){
if(x.length()==str.length()){
int code=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)==x.charAt(i)){
code++;
}
}
if(code==x.length()-1){
res.add(x);
}
}
}
return res;
}
}
`