您的位置:首页 > 其它

87. Scramble String

2016-01-25 23:00 405 查看
此题可以用动态规划来做。

public boolean isScramble(String s1, String s2) {
int n = s1.length();
boolean[][][] dp = new boolean

[n+1];  //s1从i开始,s2从j开始,长度为k的子序列互为Scramble

for(int i = n-1; i >= 0; i--)
for(int j = n-1; j>=0; j--)
for(int k = 1; k <= n-Math.max(i,j);k++)
{
if(s1.substring(i,i+k).equals(s2.substring(j,j+k)))
dp[i][j][k] = true;
else
{
for(int l = 1; l < k; l++)
{
if(dp[i][j][l] && dp[i+l][j+l][k-l] || dp[i][j+k-l][l] && dp[i+l][j][k-l])
{
dp[i][j][k] = true;
break;
}
}
}
}

return dp[0][0]
;
}


也可以递归

public boolean isScramble(String s1, String s2) {
if(s1.equals(s2)) return true;
int n = s1.length();

int[] letter = new int[26];       //判断s1、s2的字符是否一样
for(int i = 0;i < n;i++){
letter[s1.charAt(i)-'a']++;
letter[s2.charAt(i)-'a']--;
}
for(int i = 0;i < 26;i++){
if(letter[i] != 0) return false;
}

for(int i = 1;i < n;i++){
if(isScramble(s1.substring(0,i), s2.substring(0,i)) && isScramble(s1.substring(i), s2.substring(i))) return true;
if(isScramble(s1.substring(0,i), s2.substring(n-i)) && isScramble(s1.substring(i), s2.substring(0,n-i))) return true;
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: