Saturday, March 14, 2020

[Java][Exercise] Valid Anagram


Given two strings s and t, write a function to determine if t is an anagram of s.

Bad method 1
class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length())
            return false;
       
        ArrayList<Character> chars = new ArrayList<Character>();
        for(char c:s.toCharArray()){
            chars.add(c);
        }
        for(int i=0; i< t.length(); i++){
            int index = chars.indexOf(t.charAt(i));
            if (index >= 0){
                chars.remove(index);
            }
        }
        return chars.isEmpty();
    }
}


Bad method 2 (same effectivity as method 1)
class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length())
            return false;
        for(int i=0; i< t.length(); i++){
            int index = s.indexOf(t.charAt(i));
            if(index>=0){
                s = s.substring(0,index)+s.substring(index+1,s.length());
            }
        }
        return s.isEmpty();
    }
}

Better method
class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length())
            return false;
        StringBuilder sb = new StringBuilder(s);
        for(int i=0; i< t.length(); i++){
            int index = sb.indexOf(Character.toString(t.charAt(i)));
            if(index>=0){
                sb.deleteCharAt(index);
            }
        }
        return sb.length()==0;
    }
}

Good method 1
class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length())
            return false;
        char[] str1 = s.toCharArray();
        char[] str2 = t.toCharArray();
        Arrays.sort(str1);
        Arrays.sort(str2);
        return Arrays.equals(str1, str2);
    }
}

Good methods 2
public boolean isAnagram(String s, String t) {
    if (s.length() != t.length()) {
        return false;
    }
    int[] counter = new int[26];
    for (int i = 0; i < s.length(); i++) {
        counter[s.charAt(i) - 'a']++;
        counter[t.charAt(i) - 'a']--;
    }
    for (int count : counter) {
        if (count != 0) {
            return false;
        }
    }
    return true;
}

No comments :

Post a Comment