Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
For example,
Given "egg"
, "add"
, return true.
Given "foo"
, "bar"
, return false.
Given "paper"
, "title"
, return true.
分析:题目的关键是理解透彻。判断两个字符串是否为同构的结果就是两个字符串中的字符一一对应。相似的题目是:Word Pattern
我把sc作为key,tc作为value放到map中。当key在map中已存在,则需要取出其对应的value看与目前读到的tc是否一样,一样则继续,不一样则返回false;如果key在map中不存在,则需要看tc是否已作为value值存在map中,若有则说明map中有其他key与tc对应,返回false(如字符串为abcd和ffff),如果tc目前没有作为value值存在map中,则把<sc,tc>放到map中。
/** * 题目要求判断两个字符串是否为同构字符串。也就是说两个字符串之间的字符是否一一对应。 * 首先判断两个字符串的长度是否相等,如果不相等,则返回false。否则继续。 * Step1:依次读s和t中的每个字符,如果sc没有在map中,则首先判断tc是否作为value值已被map中的其他关键字映射,如果是则返回false, * 否则把<sc,tc>放到map中。 * Step2:如果sc在map中,则判断map中对应的值与tc是否一样,相同则继续,不相同的则返回false。 */ public boolean isIsomorphic(String s, String t) { if(s.length() != t.length()){ return false; }else{ int len = s.length(); Map<Character, Character> map = new HashMap<Character, Character>(); for(int i =0;i<len;i++){ char sc = s.charAt(i); char tc = t.charAt(i); /*map中不包含关键字:则首先判断tc是否作为value值已被map中的其他关键字映射,如果是则返回false,否则把<sc,tc>放到map中。*/ if(!map.containsKey(sc)){ if(map.containsValue(tc)){ return false; }else{ map.put(sc, tc); } }else{/*map中已包含关键字:判断map中对应的值与tc是否一样,相同则继续,不相同的则返回false。 */ char oldc = map.get(sc); if(oldc != tc){ return false; } } } return true; } }