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

点击打开链接

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];
}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值