48 回溯算法求解活字印刷

本文介绍了如何使用深度优先搜索(DFS)算法解决一个关于给定字母模版的问题,计算可能生成的所有非空字母序列。通过遍历和判断是否使用重复字母,算法确保每个模版只使用一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:你有一套伙子字模titles,其中每个字模上都刻有一个字母tiles[i]。返回你可能印出的非空字母序列的数字。注意在本题中,每个活字字模只能使用一次。

例:输入"AAB"
解释:所有可能的序列为'A','B','AA','AB','BA','AAB','ABA','BAA'

DFS分析:由于模版中有重复,则可以首先对于模板进行排序,在选择时,如果上一个选择了某个重复的值,则可以继续选择,若上一个值没有选择,则不能进行选择,且每次可以选择或者不选两种情况,只能进行模板长度次选择,超过且当前不为空的情况下是一种已有的情况。

public void tranceBack(char tiles,Boolean used,String templist,int index,Integer all)
{
if(templist.length()!=0&&index==tiles.length)
{
all=all+1;
return; 
}
for(int i=0;i<titles.length;i++)
{
if(used[i]==false)
{
continue;
}else
{
if(tiles[i]==templist.charAt(templist.length()-1)&&used[i]==false)
{
continue;
}
//有选和不选两种情况
used[i]=true;
tranceBack(tiles,used,templist+tiles[i],index+1,all);
used[i]=false;
tranceBack(tiles,used,templist,index+1,all);
}
}
}
public int TranceBack(String tile)
{
Integer all=0;
char [] tiles=tile.toCharArray();
Boolean used[]=new Boolean[tile.length];
tranceBack(tiles,used,new String(""),0,all);
​​​​​​​return all.parseInt();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值