Anagram

Problem Statement

Sid is obsessed with reading short stories. Being a CS student, he is doing some interesting frequency analysis with the books. He chooses strings  S1  and  S2  in such a way that  |len(S1)len(S2)|1 .

Your task is to help him find the minimum number of characters of the first string he needs to change to enable him to make it an anagram of the second string.

Note: A word x is an anagram of another word y if we can produce y by rearranging the letters of x.

Input Format The first line will contain an integer,  T , representing the number of test cases. Each test case will contain a string having length  len(S1)+len(S2) , which will be concatenation of both the strings described above in the problem.The given string will contain only characters from  a  to  z .

Output Format An integer corresponding to each test case is printed in a different line, i.e. the number of changes required for each test case. Print  1  if it is not possible.

Constraints  1T100  
1len(S1)+len(S2)104

Sample Input

6
aaabbb
ab
abc
mnop
xyyx
xaxbbbxx

Sample Output

3
1
-1
2
0
1

Explanation 
Test Case #01: We have to replace at least three characters from any of the string to make both of strings anagram. Here, a = "aaa" and b = "bbb". One possible solution is to replace all character 'a' in string a with character 'b'. 
Test Case #02: Either replace 'a' with 'b', which will generate "bb". Or replace 'b' with 'a' to generate "aa". Both of the solution are valid. 
Test Case #03: It is not possible for two strings of unequal length to be anagram for each other. 
Test Case #04: We have to replace both the characters of any string to make it anagram of other one. 
Test Case #05: _S1_ and S2 are already anagram to each other. 

Test Case #06: Here S1 = "xaxb" and S2 = "bbxx". He had to replace 'a' from S1 with 'b' so thatS1 = "xbxb" and we can rearrange its letter to "bbxx" in order to get S2.


import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
    static int changeTimes(String s){
        int res=0;
        int n=s.length();
        
        String a=s.substring(0,n>>1);   
        String b=s.substring(n>>1,n);
        StringBuffer sa=new StringBuffer(a);
        StringBuffer sb=new StringBuffer(b);
        
        int[] as=new int[26];
        int[] bs=new int[26];
        for(int i=0;i<sa.length();i++){
          as[sa.charAt(i)-'a']++;  
        }
        for(int i=0;i<sb.length();i++){
            bs[sb.charAt(i)-'a']++; 
        }
        for(int i=0;i<26;i++){
            res+=Math.abs(as[i]-bs[i]);
        }        
        return res/2;
    }

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        while(n--!=0){
            String s=cin.next();
            if(s.length()%2==1)
                System.out.println(-1);
            else{
                int res=changeTimes(s);
                 System.out.println(res);
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值