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