zoukankan      html  css  js  c++  java
  • [leedcode 87] 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) {
        /*  首先选择递归,简单明了,对两个string进行partition,然后比较四个字符串段。但是递归的话,这个时间复杂度比较高。然后想到能否DP,但是           即使用DP的话,也要O(n^3)。还是在递归里做些剪枝,这样就可以避免冗余计算:
            对于每两个要比较的partition,需要统计他们字符出现次数(字符个数和种类要一致),如果不相等返回。*/
            int s1Len=s1.length();
            int s2Len=s2.length();
            if(s1Len!=s2Len) return false;
            int frequent[]=new int[26];
            for(int i=0;i<s1Len;i++){
                int temp=s1.charAt(i)-'a';
                frequent[temp]++;
            }
            for(int i=0;i<s2Len;i++){
                int temp=s2.charAt(i)-'a';
                frequent[temp]--;
            }
            for(int i=0;i<frequent.length;i++){
                if(frequent[i]!=0)return false;
            }
            if(s1Len==1&&s2Len==1) return true;/////
            
    /*        报错:Line 26: java.lang.StackOverflowError   
            if(s1.equals(s2)) return true;
            char[] s11=s1.toCharArray();
            char[] s22=s2.toCharArray();
            Arrays.sort(s11);
            Arrays.sort(s22);
            
            if(!(String.valueOf(s11)).equals(String.valueOf(s22))) return false;*/
            
            for(int i=0;i<s1Len;i++){
                boolean temp=isScramble(s1.substring(0,i),s2.substring(0,i))&&isScramble(s1.substring(i),s2.substring(i));
                if(temp) return true;
                temp=isScramble(s1.substring(0,i),s2.substring(s2.length()-i))&&isScramble(s1.substring(i),s2.substring(0,s2.length()-i));
                if(temp) return true;
            }
            return false;
        }
    }
  • 相关阅读:
    Opencores上利用svn下载
    dc概论之多周期路径multicycle_path续2
    vim之高效编辑verilog代码(1)
    BAT编程基础
    Linux
    远程连接服务器或云数据库上的mysql服务 赖大大
    CSS文本靠右显示换行后靠左显示;vant vancol文本靠右显示换行后靠左显示
    千分位 后面保留2位小数
    F# 天生就是就异步和并行的料
    做量化模型Matlab、R、Python、F#和C++到底选择哪一个?
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4649870.html
Copyright © 2011-2022 走看看