同構(gòu)字符串
題目描述:給定兩個(gè)字符串 s 和 t,判斷它們是否是同構(gòu)的鞋诗。
如果 s 中的字符可以按某種映射關(guān)系替換得到 t 裙犹,那么這兩個(gè)字符串是同構(gòu)的。
每個(gè)出現(xiàn)的字符都應(yīng)當(dāng)映射到另一個(gè)字符钞翔,同時(shí)不改變字符的順序。不同字符不能映射到同一個(gè)字符上席舍,相同字符只能映射到同一個(gè)字符上布轿,字符可以映射到自己本身。
示例說(shuō)明請(qǐng)見LeetCode官網(wǎng)俺亮。
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/isomorphic-strings/
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有驮捍。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處脚曾。
解法一:利用HashMap
首先如果s和t都為null东且,則直接返回true;如果s和t只有一個(gè)是null本讥,則直接返回false珊泳;
用mappings記錄出現(xiàn)過(guò)的字符映射關(guān)系,遍歷s和t的所有字符拷沸,遍歷過(guò)程如下:
- 如果mappings的key中包含s當(dāng)前的字符色查,判斷對(duì)應(yīng)key的值是否等于t當(dāng)前的字符,如果不相等撞芍,則返回false秧了;
- 如果mappings的key中不包含s當(dāng)前的字符,由于相同字符只能映射到同一個(gè)字符上序无,判斷mappings的values是否包含t當(dāng)前的字符验毡,如果包含,則返回false帝嗡;如果不包含晶通,則將s當(dāng)前的字符和t當(dāng)前的作為對(duì)應(yīng)的key和value放入mappings,繼續(xù)下一遍遍歷哟玷。
最后如果遍歷完了狮辽,沒有匹配不成功的,則說(shuō)明是同構(gòu)的,返回true喉脖。
import java.util.HashMap;
import java.util.Map;
public class LeetCode_205 {
public static boolean isIsomorphic(String s, String t) {
if (s == null && t == null) {
return true;
}
if ((s == null && t != null) || (s != null && t == null)) {
return false;
}
Map<Character, Character> mappings = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
if (mappings.keySet().contains(s.charAt(i))) {
if (!(mappings.get(s.charAt(i)) == t.charAt(i))) {
return false;
}
} else {
if (mappings.values().contains(t.charAt(i))) {
return false;
} else {
mappings.put(s.charAt(i), t.charAt(i));
}
}
}
return true;
}
public static void main(String[] args) {
System.out.println(isIsomorphic("paper", "title"));
}
}
【每日寄語(yǔ)】 世界上所有的驚喜和好運(yùn)椰苟,都是你累積的溫柔和善良。