标签:
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.
Dynamic Programming String
class Solution { public: bool isScramble(string s1, string s2) { int len1 = s1.size(),len2 = s2.size(); if(help_f(s1,s2)){ if(s1==s2) return true; for( int i =1;i<len1;i++){ if(s1.substr(0,i)+s1.substr(i)==s2) return true; } for( int i=1;i<len1;i++){ if(isScramble(s1.substr(0,i),s2.substr(0,i))&&isScramble(s1.substr(i),s2.substr(i))) return true; // cout<<s1.substr(0,i)<<" "<<s2.substr(len2-i)<<" "<<s1.substr(len1-i)<<" "<<s2.substr(0,i)<<endl; if(isScramble(s1.substr(0,i),s2.substr(len2-i))&&isScramble(s1.substr(i),s2.substr(0,len2-i))) return true; } } return false; } bool help_f(string &s1,string &s2) { if(s1.size()!=s2.size()) return false; int c[26]={0}; for(int i=0;i<s1.size();i++) c[s1[i]-‘a‘] ++; for(int i=0;i<s2.size();i++){ c[s2[i]-‘a‘]--; if(c[s2[i]-‘a‘]<0) return false; } return true; } };
class Solution { public: bool isScramble(string s1, string s2) { int len1=s1.size(),len2=s2.size(); if(len1!=len2) return false; bool table[100][100][100]={false}; for(int i=len1-1;i>=0;i--){ for(int j=len1-1;j>=0;j--){ table[i][j][1]=(s1[i]==s2[j]); for(int tmpLen=2;i+tmpLen<=len1&&j+tmpLen<=len1;tmpLen++){ for(int idx=1;idx<tmpLen;idx++){ table[i][j][tmpLen]|=table[i][j][idx]&&table[i+idx][j+idx][tmpLen-idx]; table[i][j][tmpLen]|=table[i][j+tmpLen-idx][idx]&&table[i+idx][j][tmpLen-idx]; } } } } return table[0][0][len1]; } };
[LeetCode] Scramble String 字符串 dp
标签:
原文地址:http://www.cnblogs.com/Azhu/p/4239980.html