交叉字符串

给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
样例
比如 s1 = "aabcc" s2 = "dbbca"
 当 s3 = "aadbbcbcac",返回  true.
当 s3 = "aadbbbaccc", 返回 false.

dp[i][j]表示s1上[0-i]的串和s2上[0,j]的串是否可以交叉构成 s3上[0,i+j]的串


import java.util.Scanner;

/**
 * 给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
样例
比如 s1 = "aabcc" s2 = "dbbca"
 当 s3 = "aadbbcbcac",返回  true.
当 s3 = "aadbbbaccc", 返回 false.
dp[i][j]表示s1上[0-i]的串和s2上[0,j]的串是否可以交叉构成 s3上[0,i+j]的串。
 * @author Dell
 *
 */
public class Test29 {
     public static boolean isInterleave(String s1,String s2,String s3)
     {
    	 if(s1.length()+s2.length()!=s3.length())
    		 return false;
    	 if(s1.length()==0)
    		 return s2.equals(s3);
    	 if(s2.length()==0)
    		 return s1.equals(s3);
    	 
    	 boolean[][] dp=new boolean[s1.length()+1][s2.length()+1];
    	 dp[0][0]=true;
    	 for(int i=1;i<=s1.length();i++)
    	 {
    		 dp[i][0]=dp[i-1][0]&&(s3.charAt(i-1)==s1.charAt(i-1)); 
    	 }
    	 for(int j=1;j<=s2.length();j++)
    	 {
    		 dp[0][j]=dp[0][j-1]&&(s3.charAt(j-1)==s2.charAt(j-1));
    	 }
    	for(int i=1;i<=s1.length();i++)
    	{	for(int j=1;j<=s2.length();j++)
    		{
    			 int t=i+j;
    			 if(s3.charAt(t-1)==s1.charAt(i-1))
    			 {
    				 dp[i][j]=dp[i-1][j];
    			 }
    			 if(s3.charAt(t-1)==s2.charAt(j-1))
    			 {
    				 dp[i][j]=dp[i][j]||dp[i][j-1];
    			 }
    			 
    		}
    	 
    	}
    	return dp[s1.length()][s2.length()]; 
    	 
     }
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
         String s1=sc.nextLine();
         String s2=sc.nextLine();
         String s3=sc.nextLine();       
         System.out.println(isInterleave(s1,s2,s3));
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值