力扣简205 同构字符串 半* ?

不知道映射是对应位置上必须一样!只是感觉需要有一个能形成的,比如add dda我认为也合理,只要变量个数可对应就行,理解错误。

然后自己写也用的map,但是按自己的理解只是写了统计个数,没有需要一一对应,且自己对于对应的value中个数的比较不会写,没有实现。

看了题解写了下面的解法,但是这个运行过于垃圾。而且我自己觉得,如果形如“egg”和“addw”,也会认为可以映射,不应该先判断一下两个字符串长度吗??

 

 

 

 

package leetcode01;
//!!映射是对应位置上的!
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.swing.plaf.metal.MetalPopupMenuSeparatorUI;

/*给定两个字符串s和t,判断它们是否是同构的。如果s中的字符可以按某种映射关系替换得到t,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。*/

public class Solution205 {
    //自己写的没有实现,不会写对应collection的比较
//    public static boolean isIsomorphic(String s, String t) {
//        if(s.length()==0&&t.length()==0)
//            return true;
//        else if(s.length()==0||t.length()==0)
//            return false;
//        Map<Character, Integer> maps=new HashMap<Character,Integer>();
//        Map<Character, Integer> mapt=new HashMap<Character,Integer>();
//        maps.put(s.charAt(0), 1);
//        mapt.put(t.charAt(0), 1);
//        for(int i=1;i<s.length();i++) {
//            char c=s.charAt(i);
//            if(maps.containsKey(c)) {
//                maps.replace(c, maps.get(c)+1);
//            }
//            else
//                maps.put(c, 1);
//        }
//        for(int i=1;i<t.length();i++) {
//            char c=t.charAt(i);
//            if(mapt.containsKey(c)) {
//                mapt.replace(c, mapt.get(c)+1);        
//            }
//            else
//                mapt.put(c, 1);
//        }
//        if(maps.size()==mapt.size()) {
////            Collection<Integer> sets=maps.values();
////            Collection<Integer> sett=mapt.values();
////            System.out.println(sets.retainAll(sett));
////            System.out.println(sets.equals(sett));
////            if(sets.equals(sett)) {
////                return true;
////            }  //不会写对应的value相同的比较  所以这个思路没有实现
//        }
//        return false;
//    }

    public static boolean isIsomorphic(String s, String t) {
        Map<Character, Character> maps=new HashMap<Character,Character>();
        Map<Character, Character> mapt=new HashMap<Character,Character>();
        for(int i=0;i<s.length();i++) {
            char sWord = s.charAt(i);
            char tWord = t.charAt(i);
            if((maps.containsKey(sWord)&&maps.get(sWord)!=tWord)||(mapt.containsKey(tWord)&&mapt.get(tWord)!=sWord)) {
                return false;
            }
            maps.put(sWord, tWord);
            mapt.put(tWord, sWord);
        }
        return true;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s="egg";
        String t="addw";
        System.out.print(isIsomorphic(s, t));
    }

}

 去看评论里的题解了 确实有点牛!

    public static boolean isIsomorphic(String s, String t) {
          for(int i = 0; i < s.length(); i++){
              if(s.indexOf(s.charAt(i)) != t.indexOf(t.charAt(i))){//s.indexOf(ch) 返回ch在s中首次出现的位置
                  return false;
              }
          }  
          return true;
    }

 

posted @ 2022-05-30 09:58  Ssshiny  阅读(23)  评论(0)    收藏  举报