zoukankan      html  css  js  c++  java
  • 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.

     首先我想到的是scrambled string 就是原来string的全排列,而且似乎是这样的。所以算法如下:

     1 public class Solution {
     2     public boolean isScramble(String s1, String s2) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         if(s1 == null) return false;
     6         HashMap<Integer,Integer> s1m = new HashMap<Integer,Integer>();
     7         for(int i = 0; i < s1.length(); i ++){
     8             Integer c = Integer.valueOf(s1.charAt(i));
     9             Integer cc= Integer.valueOf(s2.charAt(i));
    10             if(s1m.containsKey(c)){
    11                 s1m.put(c, s1m.get(c) + 1);
    12             }else{
    13                 s1m.put(c,1);
    14             }
    15             if(s1m.containsKey(cc)){
    16                 s1m.put(cc,s1m.get(cc) - 1);
    17             }else{
    18                 s1m.put(cc,-1);
    19             }
    20         }
    21         Iterator it= s1m.keySet().iterator();
    22         while (it.hasNext())
    23         {
    24             Object key=it.next();
    25             if(s1m.get(key) != 0){
    26                 return false;
    27             }
    28         }
    29         return true;
    30     }
    31 }

    但是 测试是发现问题: 

    inputoutputexpected 
    "abcd", "bdac" true false
     X

    看出来 并不是全排列,而是有相对顺序的。

     然后就想应该可以用DP来做,从顶往下走,一定在某一部能发现 s1 的左子树 等于 s2的右子树, s1的右子树 等于 s2的左子树。

     这是使用递归的算法:

     1 public class Solution {
     2     public boolean isScramble(String s1, String s2) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         if(s1.equals(s2)) return true;
     6         int v1 = 0;
     7         int v2 = 0;
     8         int size = s1.length();
     9         for(int i = 0; i < size; i ++){
    10             v1 += Integer.valueOf(s1.charAt(i));
    11             v2 += Integer.valueOf(s2.charAt(i));
    12         }
    13         if(v1 != v2) return false;
    14         for (int i=1; i<size;i++) {
    15             if (isScramble(s1.substring(0,i), s2.substring(0,i)) && isScramble(s1.
    16 substring(i), s2.substring(i)))
    17                 return true;
    18             if (isScramble(s1.substring(0,i), s2.substring(size-i)) && isScramble(
    19 s1.substring(i), s2.substring(0,size-i)))
    20                 return true;
    21         }
    22         return false;
    23     }
    24 }
  • 相关阅读:
    最佳牛栏(前缀和+二分)
    分形之城(递归)
    约数之和(两种方法)
    递归实现指数型枚举
    【Luogu P3704】 [SDOI2017]数字表格
    【Luogu P2257】 YY的GCD
    【Luogu P2522】 [HAOI2011]Problem b
    【Luogu P3455】 [POI2007]ZAP-Queries
    【Luogu P3597】 [POI2015]WYC
    【Luogu T145192】 【2020.8.23NOIP模拟赛】最优路线
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3342061.html
Copyright © 2011-2022 走看看