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.
class Solution { public: bool isInterleave(string s1, string s2, string s3) { if(s1.empty()) { if(s2 == s3) return true; else return false; } else if(s2.empty()) { if(s1==s3) return true; else return false; } int l1 = s1.length(); int l2 = s2.length(); int l3 = s3.length(); if(l3!=l1+l2) return false; bool** hit = new bool* [l1+1]; //状态hit[i][j]表示s3[i+j-1]由s1的前i个字符和s2的前j个字符组成 for(int i = 0; i<=l1; i++) { hit[i] = new bool [l2+1]; } //initialize state hit[0][0] = true; for ( int i = 1; i<=l1; i++) { if(s1[i-1] == s3[i-1]) { hit[i][0] = true; } else { for(int j = i; j <= l1; j++){ hit[j][0] = false; } break; } } for ( int i = 1; i<=l2; i++) { if(s2[i-1] == s3[i-1]) { hit[0][i] = true; } else { for(int j = i; j <= l2; j++){ hit[0][j] = false; } break; } } //状态转移 for ( int i = 1; i<=l1; i++) { for( int j = 1; j<=l2; j++) { if(s1[i-1]==s3[i+j-1]) { hit[i][j] = hit[i-1][j]; } if(s2[j-1]==s3[i+j-1]) { hit[i][j] = hit[i][j-1] || hit[i][j]; } } } return hit[l1][l2]; } };
97. Interleaving String (String; DP)
原文:http://www.cnblogs.com/qionglouyuyu/p/4919275.html