leetcode-12 字符串

12.2 字符串比较

  • 242 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

// 解法1:排序后逐个比较字符
bool isAnagram(string s, string t) {
    if (s.length() != t.length())return false;
    sort(s.begin(), s.end());
    sort(t.begin(), t.end());
    for (int i = 0; i < s.length(); i++) {
        if (s[i] != t[i])return false;
    }
    return true;
}
// 解法2:使用map记录每个字符及其出现次数
bool isAnagram(string s, string t) {
    if (s.length() != t.length())return false;
    unordered_map<char, int> s_map;
    unordered_map<char, int> t_map;
    for (int i = 0; i < s.length(); ++i) {
        s_map[s[i]]++;
        t_map[t[i]]++;
    }
    for (auto &[c,count]: s_map) {
        if (t_map[c] != count)return false;
    }
    return true;
}
// 解法3:使用一个vector同时记录s和t中字符出现次数
bool isAnagram(string s, string t) {
    if (s.length() != t.length())return false;
    vector<int> count(26, 0);
    for (int i = 0; i < s.length(); ++i) {
        count[s[i] - 'a']++;
        count[t[i] - 'a']--;
    }
    for (int i = 0; i < 26; i++) {
        if (count[i])return false;
    }
    return true;
}
  • 205 同构字符串

给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

// 解法1:将字符串转化为数组,例如"egg"变成[1,2,2],"paper"变成[1,2,1,3,4],然后再判断数组是否相同
bool isIsomorphic(string s, string t) {
    if (s.length() != t.length())return false;
    vector<int> v1 = str2vector(s);
    vector<int> v2 = str2vector(t);
    for (int i = 0; i < s.length(); i++) {
        if (v1[i] != v2[i])return false;
    }
    return true;
}

vector<int> str2vector(const string &str) {
    vector<int> res;
    unordered_map<char, int> map; // 记录每个字符是第几个出现的
    int index = 1;
    for (int i = 0; i < str.length(); i++) {
        if (map.find(str[i]) == map.end()) {
            map[str[i]] = index;
            res.push_back(index);
            index++;
        } else {
            res.push_back(map[str[i]]);
        }
    }
    return res;
}
// 解法2:记录两个字符串每个位置的字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。
// 例如,对于“paper”和“title”,假设我们现在遍历到第三个字符“p”和“t”,发现它们第一次出现的位置都在第一个字符,则说明目前位置满足同构
bool isIsomorphic(string s, string t) {
    if (s.length() != t.length())return false;
    // 记录s/t中每个字符出现的位置
    vector<int> s_first_index(256, -1);
    vector<int> t_first_index(256, -1);
    for (int i = 0; i < s.length(); i++) {
        if (s_first_index[s[i]] != t_first_index[t[i]]) {
            return false;
        }
        s_first_index[s[i]] = t_first_index[t[i]] = i;
    }
    return true;
}
posted @ 2024-08-10 09:16  dengkang1122  阅读(13)  评论(0)    收藏  举报