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。

    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码