字符串的交错组成

来源:互联网 发布:室内设计软件培训 编辑:程序博客网 时间:2024/05/18 02:38

//字符串的交错组成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));}}


原创粉丝点击