LeetCode1153 字符串转化

题目

给出两个长度相同的字符串 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;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值