【leetcode】87.(Hard)Scrambling String

解题思路:
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];
    }
    }

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/84501375