【leetcode】87.(Hard)Scrambling String
阿新 • • 發佈:2018-12-02
解題思路:
1.遞迴
如果一個字串s1是另外一個字串s2的scramble string的話,那必定可以找到一個劃分方式,使得s1的左右子串分別是s2左右子串的scramble string
2.DP
https://blog.csdn.net/linhuanmars/article/details/24506703
參考上面的帖子。設定一個三維陣列,第一維表示長度,第二維表示s1的起點,第三維表示s2的起點。dp[len][i][j]表示當s1從i開始,s2從j開始,計算len個字元是否是cramble string。
提交程式碼1:遞迴
class Solution {
public boolean isScramble(String s1, String s2) {
if(s1.length()!=s2.length()) return false;
if(s1.length()==1) {
if(s1.equals(s2)) return true;
else return false;
}
int n=s1.length();
boolean flag1,flag2,flag3,flag4;
if(s1.length()==2) {
flag1=(s1.charAt (0)==s2.charAt(0));
flag2=(s1.charAt(1)==s2.charAt(1));
flag3=(s1.charAt(1)==s2.charAt(0));
flag4=(s1.charAt(0)==s2.charAt(1));
if((flag1&&flag2)||(flag3&&flag4)) return true;
else return false;
}
//check the word package
int[] letters=new int[26];
for(int i=0;i<s1.length();i++) {
letters[s1.charAt(i)-'a']++;
letters[s2.charAt(i)-'a']--;
}
for(int i=0;i<26;i++) {
if(letters[i]!=0) return false;
}
for(int i=1;i<s1.length();i++) {
String sub11=s1.substring(0,i);
String sub12=s1.substring(i,s1.length());
String sub21=s2.substring(0, i);
String sub22=s2.substring(i,s2.length());
String sub23=s2.substring(0,n-i);
String sub24=s2.substring(n-i);
flag1=isScramble(sub11,sub21);
flag2=isScramble(sub12,sub22);
flag3=isScramble(sub11,sub24);
flag4=isScramble(sub12,sub23);
if((flag1&&flag2)||(flag3&&flag4)) return true;
}
return false;
}
}
執行結果:
程式碼2:DP
class Solution {
public boolean isScramble(String s1, String s2) {
if(s1.length()!=s2.length()) return false;
boolean dp[][][]=new boolean[s1.length()+1][s1.length()][s2.length()];
for(int i=0;i<s1.length();i++)
for(int j=0;j<s2.length();j++)
dp[1][i][j]=(s1.charAt(i)==s2.charAt(j));
boolean flag1,flag2;
for(int layer=2;layer<=s1.length();layer++) {
for(int i=0;i<s1.length()-layer+1;i++) {
for(int j=0;j<s2.length()-layer+1;j++) {
for(int k=1;k<layer;k++) {
flag1=dp[k][i][j]&&dp[layer-k][i+k][j+k];
flag2=dp[k][i][j+layer-k]&&dp[layer-k][i+k][j];
if(flag1||flag2) {
dp[layer][i][j]=true;break;
}
}
}
}
}
return dp[s1.length()][0][0];
}
}