题目
给出两个长度相同的字符串 str1 和 str2。请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2。
每一次转化时,你可以将 str1 中出现的 所有 相同字母变成其他 任何 小写英文字母。
只有在字符串 str1 能够通过上述方式顺利转化为字符串 str2 时才能返回 true 。
示例 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 <= 104
str1 和 str2 中都只会出现小写英文字母
解题思路(哈希表)
因为每次转化的时候,会一次性的将 str1 中出现的所有的相同字母都改变成同一个字符。所以当 str1 中某两个下标 i 和 j 字符相同时,那么 str2 中这个两个下标的字符也必须相同。我们可以使用哈希表保存 str1 中每个第一次出现的字符对应 str2 中的字符。如果后面出现同样的字符,可以直接通过哈希表判断。这里我们用数组模拟哈希表。用两个数组模拟字符串之间的转换。当遇到之前出现的字母时进行比较是否相同。最后遍历数组,如果发现都用映射,说明转换失败。具体看代码:
代码
class Solution {
public boolean canConvert(String str1, String str2) {
if(str1.equals(str2)) {
return true;
}
int[] from = new int[26], to = new int[26];
Arrays.fill(from, -1);
Arrays.fill(to, -1);
for(int i = 0; i < str1.length(); i++) {
int a = str1.charAt(i) - 'a', b = str2.charAt(i) - 'a';
if(from[a] >= 0 && from[a] != b) {
return false;
}
from[a] = b;
to[b] = a;
}
for(int i : to) {
if(i < 0) {
return true;
}
}
return false;
}
}