您的位置:首页 > 其它

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

2017-06-20 22:01 267 查看
点击打开链接

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
[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
[i][j]=true;
break;}
}
}
}
}
return dp[len][0][0];
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐