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];
}
};
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];
}
};
相关文章推荐
- scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划
- LeetCode 笔记系列 19 Scramble String [合理使用递归]
- 87. Scramble String(三维动态规划+形似map的数组使用技巧)
- [LeetCode] Scramble String(树的问题最易用递归)
- LeetCode题目:Scramble String,三维动态规划
- 编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中 的字符串操作函数。
- 编写一个函数reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。
- LeetCode Scramble String(动态规划)
- 87. Scramble String *HARD* 动态规划
- python使用递归和动态规划分别计算斐波那契数列
- LeetCode-Scramble String-乱序字符串-动态规划
- leetcode:Interleaving String 使用动态规划求解的java源代码
- //4. 编写一个函数reverse_string(char * string)(递归实现) //实现:将参数字符串中的字符反向排列。 //要求:不能使用C函数库中的字符串操作函数。
- Scramble String 动态规划
- 天题系列: Scramble String -- 三维动态规划
- 01背包问题python(使用递归和动态规划)
- 字符串最短距离CalculateStringDistance(递归 or 动态规划)
- 【C语言】编写一个函数reverse_string(char * string)(递归实现),将参数字符串中的字符反向排列,不能使用C函数库中的字符串操作函数。
- leetcode 87 Scramble String(动态规划)
- 使用System.Convert.ToString将字符串转换成utf16进制编码