AcWing 190. 字串变换 JAVA 代码走一个
原题链接
中等
作者:
特困生
,
2021-05-26 11:45:37
,
所有人可见
,
阅读 355
import java.io.*;
import java.util.*;
public class 字串变换 {
static Map<String,Integer> m1 = new HashMap<>();
static Map<String,Integer> m2 = new HashMap<>(); //终点
static Queue<String> q1 = new LinkedList<>();
static Queue<String> q2 = new LinkedList<>(); //终点
static String A;
static String B;
static List<String> a = new ArrayList<>(); //变换规则 起点用
static List<String> b = new ArrayList<>(); //变换规则 终点用
public static void main(String[] args) throws IOException {
Scanner cin = new Scanner(System.in);
String s[] = cin.nextLine().split("\\s+");
A = s[0]; B = s[1];
while(cin.hasNextLine()){ //加入规则
s = cin.nextLine().split("\\s+");
a.add(s[0]);
b.add(s[1]);
}
int step = bfs();
System.out.println(step<=10?step:"NO ANSWER!");
}
static int bfs(){
q1.offer(A);m1.put(A,0);
q2.offer(B);m2.put(B,1);
while (!q1.isEmpty()&&!q2.isEmpty()){
if(q1.size()<q2.size()){
String t = q1.poll();
for(int k = 0;k<t.length();k++){ //t从哪里开始扩展
for(int i = 0;i<a.size();i++){ //枚举规则
String x = a.get(i); //取出变换规则
int idx = t.indexOf(x,k);//从k开始找
if(idx==-1) continue; //不存在这个变换
k = idx; //存在这个变换,直接剪枝到这。
String m = t.substring(0,idx)+b.get(i)+t.substring(idx+x.length());
if(m2.containsKey(m)) return m1.get(t)+m2.get(m);
if(m1.containsKey(m)) continue; //存在就不加了,肯定是最小值
q1.add(m);
m1.put(m,m1.get(t)+1);
}
}
}else{
String t = q2.poll();
for(int k = 0;k<t.length();k++) { //t从哪里开始扩展
for(int i = 0;i<b.size();i++){
String x = b.get(i); //取出变换规则
int idx = t.indexOf(x,k);//从k开始找
if(idx==-1) continue; //不存在这个变换
k = idx; //存在这个变换,直接剪枝到这。
String m = t.substring(0,idx)+a.get(i)+t.substring(idx+x.length()); //变换一次
if(m1.containsKey(m)) return m2.get(t)+m1.get(m);
if(m2.containsKey(m)) continue;
q2.add(m);
m2.put(m,m2.get(t)+1);
}
}
}
}
return 11; //未连通
}
}