scramble string (使用动态规划和递归做)

来源:互联网 发布:淘宝怎样设置运费模板 编辑:程序博客网 时间:2024/06/05 10:17

点击打开链接

class Solution {
public:
bool solve(string s1, string s2, int left1, int right1, int left2)//串的位置
{
int dist = right1 - left1;
if (dist == 1)
{
return s1[left1] == s2[left2];
}
int last2 = left2 + dist;
int freq[26];
fill(freq, freq + 26, 0);
for (int i = 0; i <dist; i++)
freq[s1[left1 + i]-'a']++;
for (int i = 0; i <dist; i++)
freq[s2[left2 + i] - 'a']--;
for (int i = 0; i < 26; i++)
{
if (freq[i])
return false;
}
for (int i = 1; i <dist; i++)
{
if (solve(s1, s2, left1, left1 + i, left2) && solve(s1, s2, left1 + i, right1, left2 + i))
return true;
if (solve(s1, s2, left1, left1 + i, last2 - i) && solve(s1, s2, left1 + i, right1, left2))
return true;
}
return false;
}
    int dp[100][100][100];
bool isScramble(string s1, string s2) {//深度优先搜索
//表示dp[n][i][j]长度为n的起点分别为i和j的是否符合
fill(&dp[0][0][0], &dp[0][0][0] + 100* 100* 100, 0);
int len = s1.size();
for (int i = 0; i <len; i++)
{
for (int j = 0; j <len; j++)
{
//初始化边界条件
dp[1][i][j] = (s1[i] == s2[j]);
}
}
for (int n = 1; n <=len; n++)
{
for (int i = 0; i+n<=len; i++)
{
for (int j = 0; j+n<=len; j++)
{
for (int k = 1; k < n; k++)
{
if ((dp[k][i][j]&&dp[n-k][i+k][j+k])||(dp[k][i][j-k+n]&&dp[n-k][i+k][j]))
                        {dp[n][i][j]=true;
break;}
}
}
}
}
return dp[len][0][0];
}
};

原创粉丝点击