//字符串的交错组成
public class IsCross{
//经典的动态规划
public static boolean isCross01(String str1,String str2,String aim)
{
if(str1==null||str2==null||aim==null)
{
return false;
}
//将字符串转换成数组
char[]ch1=str1.toCharArray();
char[]ch2=str2.toCharArray();
char[]chaim=aim.toCharArray();
if(chaim.length!=ch1.length+ch2.length)
{
return false;
}
//构建动态规划表(dp[i][j]表示用ch[0..i-1]和ch2[0..j-1]能否表示aim[i+j-1])
boolean[][]dp=new boolean[ch1.length+1][ch2.length+1];
dp[0][0]=true;
//第一列的计算
for(int i=1;i<=ch1.length;i++)
{
if(ch1[i-1]!=chaim[i-1])
{
break;
}
dp[i][0]=true;
}
//第一行的计算
for(int j=1;j<=ch2.length;j++)
{
if(ch2[j-1]!=chaim[j-1])
{
break;
}
dp[0][j]=true;
}
for(int i=1;i<=ch1.length;i++)
{
for(int j=1;j<=ch2.length;j++)
{
if((ch1[i-1]==chaim[i+j-1]&&dp[i-1][j])||
(ch2[j-1]==chaim[i+j-1]&&dp[i][j-1]))
{
dp[i][j]=true;
}
}
}
return dp[ch1.length][ch2.length];
}
//动态规划的空间压缩法(滚动法)
public static boolean isCross02(String str1,String str2,String aim)
{
if(str1==null||str2==null||aim==null)
{
return false;
}
//字符串转换成数组
char[]ch1=str1.toCharArray();
char[]ch2=str2.toCharArray();
char[]chaim=aim.toCharArray();
if(chaim.length!=ch1.length+ch2.length)
{
return false;
}
char[]longs=ch1.length>=ch2.length?ch1:ch2;//长数组
char[]shorts=ch1.length<ch2.length?ch1:ch2; //短数组
//构造滚动数组
boolean []dp=new boolean[shorts.length+1];
dp[0]=true;
for(int i=1;i<=shorts.length;i++)
{
if(shorts[i-1]!=chaim[i-1])
{
break;
}
dp[i]=true;
}
for(int i=1;i<=longs.length;i++)
{
dp[0]=dp[0]&&longs[i-1]==chaim[i-1];
for(int j=1;j<=shorts.length;j++)
{
if((longs[i-1]==chaim[i+j-1]&&dp[j])||
(shorts[j-1]==chaim[i+j-1]&&dp[j-1])
)
{
dp[j]=true;
}
else
{
dp[j]=false;
}
}
}
return dp[shorts.length];
}
public static void main(String[]args)
{
String str1="AB";
String str2="12";
String aim="AB12";
System.out.println(isCross01(str1,str2,aim));
System.out.println(isCross02(str1,str2,aim));
}
}
字符串的交错组成
最新推荐文章于 2020-10-28 13:31:01 发布