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;
}
浙公网安备 33010602011771号