zhaojie186 2015-11-28 07:39 采纳率: 0%
浏览 3418

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

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

  • 写回答

3条回答 默认 最新

  • 毕小宝 博客专家认证 2015-11-28 09:19
    关注

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

     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。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog