Interleaving String

Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.

 

利用动态规划的思想: dp[i][j] = (s[i+j-1] == s1[i-1] && dp[i-1][j] ) || (s[i+j-1] == s2[j-1] && dp[i][j-1])

dp[i][j] 表示s1中的前i位和s2中的前j位是否可以组成s3的前i+j位,其中表示时要注意下标,dp[i][j] 则在s3中为i+j-1

代码为:

  1. public boolean isInterleave(String s1, String s2, String s3) {
  2. int sz1 = s1.length();
  3. int sz2 = s2.length();
  4. int sz3 = s3.length();
  5. if(sz3 != sz1 + sz2) return false;
  6. boolean[][] flag = new boolean[sz1+1][sz2+1];
  7. for(int i=0;i<=sz1;i++)
  8. for(int j=0;j<=sz2;j++) {
  9. flag[i][j]=false;
  10. }
  11. flag[0][0]=true;
  12. for(int i=1;i<=sz1;i++) {
  13. if(s1.charAt(i-1)==s3.charAt(i-1)&&flag[i-1][0])
  14. flag[i][0]=true;
  15. }
  16. for(int i=1;i<=sz2;i++) {
  17. if(s2.charAt(i-1)==s3.charAt(i-1) && flag[0][i-1])
  18. flag[0][i]=true;
  19. }
  20. for(int i=1;i<=sz1;i++) {
  21. for(int j=1;j<=sz2;j++) {
  22. if(s3.charAt(i+j-1)==s1.charAt(i-1) && flag[i-1][j]) {
  23. flag[i][j]=true;
  24. }
  25. if(s3.charAt(i+j-1)==s2.charAt(j-1) && flag[i][j-1]) {
  26. flag[i][j]=true;
  27. }
  28. }
  29. }
  30. return flag[sz1][sz2];
  31. }

c++代码为:

  1. bool isInterleave(string s1, string s2, string s3) {
  2. if(s1.size() + s2.size() != s3.size()) return false;
  3. bool dp[s1.size()+1][s2.size()+1]; // represent the pre-s1.size and the s2.size interleave
  4. int i,j;
  5. for(i=0;i<s1.size()+1;i++)
  6. for(j=0;j<s2.size()+1;j++)
  7. dp[i][j] = false;
  8. dp[0][0] = true;
  9. for(i=1;i<s1.size()+1;i++) {
  10. if(s1.at(i-1) == s3.at(i-1) && dp[i-1][0]) {
  11. dp[i][0] = true;
  12. }
  13. }
  14. for(j=1;j<s2.size()+1;j++) {
  15. if(s2.at(j-1) == s3.at(j-1) && dp[0][j-1]) {
  16. dp[0][j] = true;
  17. }
  18. }
  19. for(i=1;i<s1.size()+1;i++) {
  20. for(j=1;j<s2.size()+1;j++) {
  21. if(s1.at(i-1) == s3.at(i+j-1) && dp[i-1][j]) {
  22. dp[i][j] = true;
  23. }
  24. if(s2.at(j-1) == s3.at(i+j-1) && dp[i][j-1]) {
  25. dp[i][j] = true;
  26. }
  27. }
  28. }
  29. return dp[s1.size()][s2.size()];
  30. }
posted @ 2014-06-24 22:30  purejade  阅读(88)  评论(0)    收藏  举报