码迷,mamicode.com
首页 > 其他好文 > 详细

Scramble String

时间:2014-08-21 00:01:23      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   使用   os   io   for   

Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.

Below is one possible representation of s1 = "great":

    great
   /      gr    eat
 / \    /  g   r  e   at
           /           a   t

To scramble the string, we may choose any non-leaf node and swap its two children.

For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".

    rgeat
   /      rg    eat
 / \    /  r   g  e   at
           /           a   t

We say that "rgeat" is a scrambled string of "great".

Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".

    rgtae
   /      rg    tae
 / \    /  r   g  ta  e
       /       t   a

We say that "rgtae" is a scrambled string of "great".

Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.

思路:枚举所有的分割点。假设s1={ s11, s12 },则可能的匹配方式为:s2={ scramble(s11), scramble(s12) }或者s2={ scramble(s12), scramble(s11) }。这样,记s2={s21,s22},问题被分解为求解:isScramble(s11,s21) && isScramble(s12,s22) 和 isScramble(s11,s22) && isScramble(s12,s21)。显然,子问题的规模较原问题变小了。

        使用DP来求解该题,Q[step][i][j]记录以s1[i]起始长度为step+1的子串(即s1.substr(i,step+1))和以s2[j]起始长度为step+1的子串(即s2.substr(j,step+1))之间是否可转换。则,Q[step][i][j] = ( Q[k][i][j] && Q[step-k-1][i+k+1][j+k+1] ) || ( Q[k][i][j+step-k] && Q[step-k-1][i+k+1][j] ),其中,k=0, 1, ..., step-1,即依次取s1[i],s1[i+1],...,s1[step]作为子串s1.substr(i,step+1)的分割点。

 1 class Solution {
 2 public:
 3     bool isScramble( string s1, string s2 ) {
 4         if( s1.length() != s2.length() ) { return false; }
 5         int slen = s1.length();
 6         vector<vector<vector<bool>>> Q( slen );
 7         for( int step = 0; step < slen; ++step ) {
 8             Q[step].resize( slen-step, vector<bool>( slen-step, false ) );
 9             vector<vector<bool>>& Qi = Q[step];
10             if( step == 0 ) {
11                 for( size_t i = 0; i != Qi.size(); ++i ) {
12                     for( size_t j = 0; j != Qi[0].size(); ++j ) {
13                         if( s1[i] == s2[j] ) { Qi[i][j] = true; }
14                     }
15                 }
16             } else {
17                 for( size_t i = 0; i != Qi.size(); ++i ) {
18                     for( size_t j = 0; j != Qi[0].size(); ++j ) {
19                         for( int k = 0; k < step; ++k )
20                         {
21                             if( ( Q[k][i][j] && Q[step-k-1][i+k+1][j+k+1] ) 
22                             || ( Q[k][i][j+step-k] && Q[step-k-1][i+k+1][j] ) ) {
23                                    Qi[i][j] = true;
24                                    break;
25                             }
26                         }
27                     }
28                 }
29             }
30         }
31         return Q.back()[0][0];
32     }
33 };

 

Scramble String,布布扣,bubuko.com

Scramble String

标签:des   style   blog   color   使用   os   io   for   

原文地址:http://www.cnblogs.com/moderate-fish/p/3925524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!