Scramble String
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 =
"great"
:great / \ gr eat / \ / \ g r e at / \ a t
To scramble the string, we may choose any non-leaf node and swap its two children.
For example, if we choose the node
"gr"
and swap its two children, it produces a scrambled string "rgeat"
.rgeat / \ rg eat / \ / \ r g e at / \ a t
We say that
"rgeat"
is a scrambled string of "great"
.
Similarly, if we continue to swap the children of nodes
"eat"
and "at"
, it produces a scrambled string "rgtae"
.rgtae / \ rg tae / \ / \ r g ta e / \ t a
We say that
"rgtae"
is a scrambled string of "great"
.
Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.
public class Solution { public boolean isScramble(String s1, String s2) { // Start typing your Java solution below // DO NOT write main() function if(s1==null || s2==null || s1.length()!=s2.length()) return false; char[]c1=s1.toCharArray(), c2=s2.toCharArray(); Arrays.sort(c1); Arrays.sort(c2); if(!(new String(c1)).equals(new String(c2))) return false; else if(s1.length()==1)return true; for(int i=0;i<s1.length()-1;i++){ if(isScramble(s1.substring(0,i+1),s2.substring(s1.length()-i-1)) && isScramble(s1.substring(i+1),s2.substring(0,s1.length()-i-1)) || isScramble(s1.substring(0,i+1),s2.substring(0,i+1)) && isScramble(s1.substring(i+1),s2.substring(i+1)))return true; } return false; } }
import java.util.Map; import java.util.HashMap; import java.util.Stack; import java.util.List; import java.util.ArrayList; public class Solution { public boolean isScramble(String s1, String s2) { // Start typing your Java solution below // DO NOT write main() function if(s1==null || s2==null || s1.length()!=s2.length()) return false; Map<Character,List<Integer>> order = new HashMap<Character,List<Integer>>(); for(int i=0;i<s1.length();i++){ if(order.containsKey(s1.charAt(i))){ order.get(s1.charAt(i)).add(i); }else{ List<Integer> l = new ArrayList<Integer>(); l.add(i); order.put(s1.charAt(i),l); } } int[] indices = new int[s2.length()]; for(int i=0;i<s2.length();i++){ if(order.containsKey(s2.charAt(i))){ indices[i]=order.get(s2.charAt(i)).get(0); order.get(s2.charAt(i)).remove(0); if(order.get(s2.charAt(i)).size()==0) order.remove(s2.charAt(i)); } else return false; } Stack<List<Integer>> neighbors = new Stack<List<Integer>>(); for(int i=0;i<indices.length;i++){ List<Integer> cur = new ArrayList<Integer>(); cur.add(indices[i]); cur.add(indices[i]); while(!neighbors.isEmpty()){ List<Integer> temp = neighbors.peek(); if(cur.get(1)==temp.get(0)-1){ temp.set(0,cur.get(0)); }else if(cur.get(0)==temp.get(1)+1){ temp.set(1,cur.get(1)); }else break; cur=neighbors.pop(); } neighbors.push(cur); } neighbors.pop(); if(neighbors.isEmpty())return true; return false; } }
2 comments:
能解释一下第二种解法的思路吗?谢谢!
第二種解法提交錯誤,"abab", "bbaa"應該輸出true,但是代碼輸出false
Post a Comment