1. 题目
给出两个长度相同的字符串,分别是 str1 和 str2。请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化后变成字符串 str2。
每一次转化时,将会一次性将 str1 中出现的 所有 相同字母变成其他 任何 小写英文字母(见示例)。
只有在字符串 str1 能够通过上述方式顺利转化为字符串 str2 时才能返回 True,否则返回 False。
示例 1:
输入:str1 = "aabcc", str2 = "ccdee"
输出:true
解释:将 'c' 变成 'e',然后把 'b' 变成 'd',
接着再把 'a' 变成 'c'。注意,转化的顺序也很重要。
示例 2:
输入:str1 = "leetcode", str2 = "codeleet"
输出:false
解释:我们没有办法能够把 str1 转化为 str2。
提示:
1 <= str1.length == str2.length <= 10^4
str1 和 str2 中都只会出现 小写英文字母
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-transforms-into-another-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
class Solution {
public:
bool canConvert(string str1, string str2) {
if(str1 == str2) return true;
unordered_map<char, char> m1_2;
int count = 0;
vector<bool> alp(26, false);
for(int i = 0; i < str2.length(); ++i)
{
if(!alp[str2[i]-'a'])
{
alp[str2[i]-'a'] = true;
count++;
}
}//统计str2的字符种类
if(count == 26) return false;
//两字符串不相等,且后者有26种字符肯定有冲突
// "aacdefghijklmnopqrstuvwxyz"
// "abcdefghijklmnopqrstuvwxyz"
for(int i = 0; i < str1.length(); ++i)
{
if(!m1_2.count(str1[i]))
m1_2[str1[i]] = str2[i];
else if(m1_2[str1[i]] != str2[i])
return false;
}
return true;
}
};
8 ms 7.8 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!