finding if two words are anagrams of each other

后端 未结 22 1233
隐瞒了意图╮
隐瞒了意图╮ 2020-11-27 14:51

I am looking for a method to find if two strings are anagrams of one another.

Ex: string1 - abcde
string2 - abced
Ans = true
Ex: string1 - abcde
string2 - ab         


        
22条回答
  •  一生所求
    2020-11-27 15:14

    let's take a question: Given two strings s and t, write a function to determine if t is an anagram of s.

    For example, s = "anagram", t = "nagaram", return true. s = "rat", t = "car", return false.

    Method 1(Using HashMap ):

    public class Method1 {
    
        public static void main(String[] args) {
            String a = "protijayi";
            String b = "jayiproti";
            System.out.println(isAnagram(a, b ));// output => true
    
        }
    
        private static boolean isAnagram(String a, String b) {
            Map map = new HashMap<>();
            for( char c : a.toCharArray()) {
                map.put(c,    map.getOrDefault(c, 0 ) + 1 );
            }
            for(char c : b.toCharArray()) {
                int count = map.getOrDefault(c, 0);
                if(count  == 0 ) {return false ; }
                else {map.put(c, count - 1 ) ; }
            }
    
            return true;
        }
    
    }
    

    Method 2 :

    public class Method2 {
    public static void main(String[] args) {
        String a = "protijayi";
        String b = "jayiproti";
    
    
        System.out.println(isAnagram(a, b));// output=> true
    }
    
    private static boolean isAnagram(String a, String b) {
    
    
        int[] alphabet = new int[26];
        for(int i = 0 ; i < a.length() ;i++) {
             alphabet[a.charAt(i) - 'a']++ ;
        }
        for (int i = 0; i < b.length(); i++) {
             alphabet[b.charAt(i) - 'a']-- ;
        }
    
        for(  int w :  alphabet ) {
             if(w != 0 ) {return false;}
        }
        return true;
    
    }
    }
    

    Method 3 :

    public class Method3 {
    public static void main(String[] args) {
        String a = "protijayi";
        String b = "jayiproti";
    
    
        System.out.println(isAnagram(a, b ));// output => true
    }
    
    private static boolean isAnagram(String a, String b) {
        char[] ca = a.toCharArray() ;
        char[] cb = b.toCharArray();
        Arrays.sort(   ca     );
    
        Arrays.sort(   cb        );
        return Arrays.equals(ca , cb );
    }
    }
    

    Method 4 :

    public class AnagramsOrNot {
        public static void main(String[] args) {
            String a = "Protijayi";
            String b = "jayiProti";
            isAnagram(a, b);
        }
    
        private static void isAnagram(String a, String b) {
            Map map = new LinkedHashMap<>();
    
            a.codePoints().forEach(code -> map.put(code, map.getOrDefault(code, 0) + 1));
            System.out.println(map);
            b.codePoints().forEach(code -> map.put(code, map.getOrDefault(code, 0) - 1));
            System.out.println(map);
            if (map.values().contains(0)) {
                System.out.println("Anagrams");
            } else {
                System.out.println("Not Anagrams");
            }
        }
    }
    

    In Python:

    def areAnagram(a, b):
        if len(a) != len(b): return False
        count1 = [0] * 256
        count2 = [0] * 256
        for i in a:count1[ord(i)] += 1
        for i in b:count2[ord(i)] += 1
    
        for i in range(256):
            if(count1[i] != count2[i]):return False    
    
        return True
    
    
    str1 = "Giniiii"
    str2 = "Protijayi"
    print(areAnagram(str1, str2))
    

    Let's take another famous Interview Question: Group the Anagrams from a given String:

    public class GroupAnagrams {
        public static void main(String[] args) {
            String a = "Gini Gina Protijayi iGin aGin jayiProti Soudipta";
            Map> map = Arrays.stream(a.split(" ")).collect(Collectors.groupingBy(GroupAnagrams::sortedString));
            System.out.println("MAP => " + map);
            map.forEach((k,v) -> System.out.println(k +" and the anagrams are =>" + v ));
            /*
             Look at the Map output:
            MAP => {Giin=[Gini, iGin], Paiijorty=[Protijayi, jayiProti], Sadioptu=[Soudipta], Gain=[Gina, aGin]}
            As we can see, there are multiple Lists. Hence, we have to use a flatMap(List::stream)
            Now, Look at the output:
            Paiijorty and the anagrams are =>[Protijayi, jayiProti]
    
            Now, look at this output:
            Sadioptu and the anagrams are =>[Soudipta]
            List contains only word. No anagrams.
            That means we have to work with map.values(). List contains all the anagrams.
    
    
            */
            String stringFromMapHavingListofLists = map.values().stream().flatMap(List::stream).collect(Collectors.joining(" "));
            System.out.println(stringFromMapHavingListofLists);
        }
    
        public static String sortedString(String a) {
            String sortedString = a.chars().sorted()
                    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();
    
            return sortedString;
    
        }
    
        /*
         * The output : Gini iGin Protijayi jayiProti Soudipta Gina aGin
         * All the anagrams are side by side.
         */
    }
    

提交回复
热议问题