1. 程式人生 > 其它 >Leetcode 205 同構字串

Leetcode 205 同構字串

  依然是簡單題,熟悉 uthash 的使用。終於想通了,為何封裝 HASH_ADD 等相關方法時,需要傳入指標的指標,因為 uthash 庫的實現都是寫在巨集中的,編譯後不是函式呼叫,而是程式碼替換!

  C:

#include "stdbool.h"
#include <string.h>
#include "./lib/uthash-master/include/uthash.h"

typedef struct Map
{
    char k;
    char v;
    UT_hash_handle hh;
} Map;

bool mapContains(char key, Map **map)
{
    Map 
*reMap = NULL; HASH_FIND(hh, *map, &key, sizeof(char), reMap); if (reMap == NULL) return false; return true; } int mapAdd(char key, char value, Map **map) { Map *m = (Map *)malloc(sizeof(Map)); m->k = key; m->v = value; if (mapContains(key, map))
return false; HASH_ADD(hh, *map, k, sizeof(char), m); return true; } char mapGet(char key, Map **map) { Map *tmp = NULL; HASH_FIND(hh, *map, &key, sizeof(char), tmp); return tmp->v; } void MapClear(Map **map) { struct Map *current, *tmp; HASH_ITER(hh, *map, current, tmp) { HASH_DEL(
*map, current); free(current); } } bool isIsomorphic(char *s, char *t) { int len = strlen(s); Map *dict0 = NULL, *dict1 = NULL; bool re = true; for (int i = 0; i < len; i++) { char char0 = s[i], char1 = t[i]; if ((mapContains(char0, &dict0) && mapGet(char0, &dict0) != char1) || (mapContains(char1, &dict1) && mapGet(char1, &dict1) != char0)) { re = false; break; } mapAdd(char0, char1, &dict0); mapAdd(char1, char0, &dict1); } MapClear(&dict0); MapClear(&dict1); return re; }

  JAVA:

public final boolean isIsomorphic(String s, String t) {
        Map<Character, Character> dict0 = new HashMap<Character, Character>();
        Map<Character, Character> dict1 = new HashMap<Character, Character>();
        for (int i = 0; i < s.length(); i++) {
            char char0 = s.charAt(i), char1 = t.charAt(i);
            if (dict0.keySet().contains(char0) && dict0.get(char0) != char1) return false;
            if (dict1.keySet().contains(char1) && dict1.get(char1) != char0) return false;
            dict0.put(char0, char1);
            dict1.put(char1, char0);
        }
        return true;
    }

  JS:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function (s, t) {
    let dict0 = new Map(), dict1 = new Map();
    for (let i = 0; i < s.length; i++) {
        let char0 = s.charAt(i), char1 = t.charAt(i);
        if (dict0.get(char0) && dict0.get(char0) != char1) return false;
        if (dict1.get(char1) && dict1.get(char1) != char0) return false;
        dict0.set(char0, char1);
        dict1.set(char1, char0);
    }
    return true;
};