最小操作数-Java实现

来源:互联网 发布:免费淘宝客高佣金采集 编辑:程序博客网 时间:2024/05/21 10:27

最小操作数

题目详情:

给了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",有以下两种可能:

  1. "hit" -> "hot" ->  "dot" ->  "dog" -> "cog";
  2. "hit" ->  "hot" ->  "lot" ->  "log"  ->"cog"。

答题说明:


  1. A和B相同的情况下不需要做转换,此时直接返回空集;
  2. main函数是为方便你在提交代码之前进行在线编译测试,可不完成。
  3. 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);//起始为aboolean find=false;//可以到达bint 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;}}




原创粉丝点击