lc 87 Scramble String
我们需要检查所有cut字符串的位置
即s1(0, 1, 2, ..., n-1), s2(0, 1, 2, ..., n-1)
设cut点为i,将字符串分为(0~i-1),(i~n-1)
1=<i<=n-1( i=0的情况直接用equals(),判断s1s2是否相等即可)
需要注意的是,有两种可能性
a) s1(0~i-1)配s2(0~i-1),s1(i~n-1)配s2(i~n-1)
b) s1(0~i-1)配s2(n-i, n-1), s1(i~n-1)配s2(0~n-i-1)
除此之外,需要检查配对字符串是否为anagram,同字母异序串,例如aabababs,saaaabbb
可以用int[26]检查字母出现次数
不同就返回false
然后利用递归式,分别检查这两种情况,但凡a)或b)中两个配对式都返回true,说明是scramble String
1 class Solution { 2 public boolean isScramble(String s1, String s2) { 3 if(s1.equals(s2)) 4 return true; 5 int[] abc = new int[26]; 6 for(int i=0; i<s1.length(); i++){ 7 abc[s1.charAt(i)-'a']++; 8 abc[s2.charAt(i)-'a']--; 9 } 10 11 for(int i : abc) 12 if(i != 0) 13 return false; 14 15 for(int i=1; i<s1.length(); i++){ 16 if(isScramble(s1.substring(0, i), s2.substring(0, i)) && isScramble(s1.substring(i), s2.substring(i))) 17 return true; 18 if(isScramble(s1.substring(0, i), s2.substring(s2.length() - i)) && isScramble(s1.substring(i), s2.substring(0, s2.length()-i))) 19 return true; 20 } 21 return false; 22 } 23 }