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;
        }
    }
  • 相关阅读:
    HTML5触屏版多线程渲染模板技术分享
    Yii2使用驼峰命名的形式访问控制器
    记一次MySQL中Waiting for table metadata lock问题的处理
    Mac下安装配置NMP环境
    Mac安装PHP(Homebrew/php弃用、其他第三方tap也已经弃用或者迁移后的安装配置方案)
    PHPStorm等编辑器debug调试(包括使用postman、soapUI)
    NoSQL数据库浅析
    PHP的抽象类和抽象方法以及接口总结
    Yii2中使用Soap WebSerivce
    Yii2之发送电子邮件
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4649870.html
Copyright © 2011-2022 走看看