1. 程式人生 > >【leetcode】87.(Hard)Scrambling String

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