最小操作数-Java实现

最小操作数

题目详情:

给了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);//起始为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;
    	}
    }




评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值