每日一题.242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

我的解法:首先定义一个长度为26的int数组flag,用于标记字符串中字母出现的次数。对于字符串s中的字母,flag在字母下标对应的元素位置+1;对于字符串t中的字母,flag在字母下标对应的元素位置-1。最后遍历flag,若所有元素都为0,说明t是s的字母异位词,反之则不是。

时间复杂度:O(n),空间复杂度:O(n)

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] flag = new int[26];
        char[] ss = s.toCharArray();
        for (char c : ss) {
            flag[c - 'a']++;
        }
        char[] tt = t.toCharArray();
        for (char c : tt) {
            flag[c - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (flag[i] != 0) {
                return false;
            }
        }
        return true;
    }
}

改进算法:首先判断s和t的长度是否相同,若不同则说明t不是s的字母异位词。然后同时遍历s和t,对于字符串s中的字母,flag在字母下标对应的元素位置+1;对于字符串t中的字母,flag在字母下标对应的元素位置-1。最后判断flag中是否所有元素都为0。

时间复杂度:O(n),空间复杂度:O(n)

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] flag = new int[26];
        for (int i = 0; i < s.length(); i++) {
            flag[s.charAt(i) - 'a']++;
            flag[t.charAt(i) - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (flag[i] != 0) {
                return false;
            }
        }
        return true;
    }
}

你可能感兴趣的:(每日一题.242. 有效的字母异位词)