Java 如何更好地判断一个字符串是一个字符串打乱顺序后的字符串

a="csdnnet"; b="descntn" ---> return true
a="hello"; b="oelhg" --->return false

算法思想:首先两个字符串长度必须相等;其次,目标串中的各个字符必须都包含在原串中;
第三,目标串种各个字符的个数必须跟原串中对应字符的个数一样。
实例代码:

 import java.util.HashMap;
import java.util.Map;

public class StringOrderUtil {
    public static boolean isScrambledString(String source,String target){
        if(source==null||target==null){
            throw new IllegalArgumentException("source or target is null.");
        }

        if(source.length()!=target.length()){
            System.out.println("target string's length is not equal to source length.");
            return false;
        }

        //目标串中每个字符都包含在原串中
        int length = source.length();
        Map<Character,Integer> targetCount = new HashMap<Character,Integer>();
        for(int i =0;i<length;i++){
            char c = target.charAt(i);
            //target中某个字符不在原串中,返回false
            int indexOfSource = source.indexOf(c);
            if(indexOfSource==-1){
                return false;
            }

            //统计该串在本串中的个数
            if(targetCount.get(c)==null){
                targetCount.put(c, 1);
            }else{
                Integer count = targetCount.get(c);
                targetCount.put(c, 1+count);
            }
        }

        //统计原串中各个字符的个数
        Map<Character,Integer> sourceCount = new HashMap<Character,Integer>();
        for(int i =0;i<length;i++){
            char c = source.charAt(i);
            if(sourceCount.get(c)==null){
                sourceCount.put(c, 1);
            }else{
                Integer count = sourceCount.get(c);
                sourceCount.put(c, 1+count);
            }
        }

        //目标串中每个字符个数跟原串中对应字符的个数一样
        for(Map.Entry<Character, Integer> entry:targetCount.entrySet()){
            Character key = entry.getKey();
            if(entry.getValue()!=sourceCount.get(key)){
                return false;
            }
        }

        //目标串中的每个元素都在原串中,且对应个数相同
        return true;
    }

    public static void main(String[] args) {
        String a = "csdnnet";
        String b = "descntn";
        boolean result = isScrambledString(a,b);
        System.out.println(result);

        //个数不同
        b =  "descnnn";
        result = isScrambledString(a,b);
        System.out.println(result);
    }
}

测试通过,OK。

用用hashmap统计每种字符的个数然后比较两个hashmap

思路:先将字符串转换格式为byte,再用sort函数排序,再用equals比较
实战:byte[] a1=a.getBytes();
byte[] a2=a.getBytes();
Arrays.sort(a1);
Arrays.sort(a2);
String aa1=new String(a1);
String aa2=new String(a2);
aa1.equals(aa2);