Leetcode205 同构字符串

题目描述

给定两个字符串 s 和 t,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

1 例如

示例 1:
输入:s = "egg", t = "add"
输出:true

示例 2:
输入:s = "foo", t = "bar"
输出:false

示例 3:
输入:s = "paper", t = "title"
输出:true

2 分析:

我们可以利用一个 map 来处理映射。对于 s 到 t 的映射,我们同时遍历 s 和 t ,假设当前遇到的字母分别是 c1 和 c2;

若map[c1]存在,那么就判断 map[c1] 是否等于 c2,也就是验证之前的映射和当前的字母是否相同。
若map[c1]不存在,就将c1 映射 c2,map[c1] = c2;

3 代码:

package com.johann.leetcode;

/*
题目:同构字符串

1、例如:s="ab" t="bc"
s->t
a->b
b->c
return true;

2、例如:s="cca" t="aad"
c->a
c->a
a->d
return true;

分析:
我们可以利用一个 map 来处理映射。对于 s 到 t 的映射,我们同时遍历 s 和 t ,假设当前遇到的字母分别是 c1 和 c2;

若map[c1]存在,那么就判断 map[c1] 是否等于 c2,也就是验证之前的映射和当前的字母是否相同。
若map[c1]不存在,就将c1 映射 c2,map[c1] = c2;

 */

import java.util.HashMap;
import java.util.Map;

public class T205_IsomorphicString {
   //单向的s->t
   private static boolean isomorphic(String s, String t){

       //事先排除两字符串不相等的情况  和  排除""这种特殊情况
       if (s.length() != t.length() || t.isEmpty()) {
           System.out.println("输入不合法或字符串长度不一致");
           return  false;
       }
       //定义一个map映射,存储字符char
       Map<Character,Character> map =new HashMap<>();
       //拿到长度
       int n = s.length();
       //循环遍历s
       for (int i = 0; i < n; i++) {
            char c1 = s.charAt(i);
            char c2 = t.charAt(i);
           if (map.containsKey(c1)) {
               if (map.get(c1) != c2) {
                   return false;
               }
           }else {
               map.put(c1,c2);
           }

       }
       return true;
   }
   //再递归调用一次,变成双向,即s->t  t->s
   private static boolean bidirectionalIsomorphic(String s,String t){
       return isomorphic(s,t) && isomorphic(t,s);
   }

    public static void main(String[] args) {
       String s1="";
       String t1="ab";
       //System.out.println(isomorphic(s1,t1));   //单向是true
       System.out.println(bidirectionalIsomorphic(s1,t1)); //双向是false
    }
}

4 链接:

https://gitee.com/johannting/learnjava.git



我们的口号是:享受编码,快乐生活
欢迎关注哦~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JohannTing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值