最小操作数
题目详情:
给了A、B两个单词和一个单词集合Dict,每个的长度都相同。我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词中的一个字母,同时,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。
举个例子如下:
Given:
A = "hit"
B = "cog"
Dict = ["hot","dot","dog","lot","log"]
Return
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
即把字符串A = "hit"转变成字符串B = "cog",有以下两种可能:
- "hit" -> "hot" -> "dot" -> "dog" -> "cog";
- "hit" -> "hot" -> "lot" -> "log" ->"cog"。
答题说明:
- A和B相同的情况下不需要做转换,此时直接返回空集;
- main函数是为方便你在提交代码之前进行在线编译测试,可不完成。
-
import java.util.*; public class 最小操作数 { public static void main(String[] args) { String []dict={"hot","dot","dog","lot","log"}; String a="hit",b="cog"; System.out.println(finMin(a,b,dict)); } public static ArrayList<ArrayList<String>> finMin(String a,String b,String[]dict) { if(a.equals(b)) return null; ArrayList<String> dictlist=new ArrayList<String>();//把字典转换成list,易于删除 for(int i=0;i<dict.length;i++) dictlist.add(dict[i]); ArrayList<ArrayList<String>> result=new ArrayList<ArrayList<String>>();//最小步数修改方法 result.add(new ArrayList<String>()); result.get(0).add(a);//起始为a boolean find=false;//可以到达b int step=1;//方法的步数 while(!find) { boolean ifremove[]=new boolean[dictlist.size()];//字典元素移除标记 for(int j=0;j<ifremove.length;j++) ifremove[j]=false; int size=result.size(); for(int i=0;i<size;i++) { if(oneStepTo(b,result.get(i).get(step-1)))//可一步变成b { find=true; break; } else { if(dictlist.size()==0) { result.remove(i); size--; i--; continue; } ArrayList<String> temp= new ArrayList<String>(); temp.addAll(result.get(i)); result.remove(i); size--; i--; for(int j=0;j<dictlist.size();j++)//添加可行分支路径 { if(oneStepTo(temp.get(temp.size()-1),dictlist.get(j))) { ifremove[j]=true; result.add(new ArrayList<String>()); result.get(result.size()-1).addAll(temp); result.get(result.size()-1).add(dictlist.get(j)); } } } } for(int j=0,current=0;current<ifremove.length;j++,current++)//处理restdict { if(ifremove[current]==true) { dictlist.remove(j); j--; } } if(!find) step++; } return result; } public static boolean oneStepTo(String a,String b)//可否一次到达 { int step=0; for(int i=0;i<a.length();i++) { if(a.charAt(i)!=b.charAt(i)) step++; } if(step==1) return true; return false; } }