[leetcode]問題解答と解説。205. Isomorphic Strings [JavaScript]

[leetcode]問題解答と解説。205. Isomorphic Strings [JavaScript]

皆さんleetCode好きですよね。私も好きです。
なかなかやる機会がないのですよね。

私はある決意をして今臨んでいます。
モチベーションを保つためだけにこれをやっています。

では今日のleetCode。
「205. Isomorphic Strings」の解決策と方法。自分がまず挑戦して
やったことをさらけ出します。

※下にある自分のコードは自分で設けた制限時間内に書けたところまです。

これは
「私は年末までこれを続けたらどんなleetCoderになるか」のシリーズ。
実験的ブログ更新です。

森田賢二のleetCode

森田賢二のleetCode

205. Isomorphic Strings ルール

ざっくり和訳

Given two strings s and t, determine if they are isomorphic.

Two strings s and t 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.

2つの文字列sとtが与えられたとき、それらが同型であるかどうかを判定せよ。

2つの文字列sとtは、sの文字を置き換えてtを得ることができる場合、同型である。

ある文字の出現箇所はすべて、文字の順序を保ったまま別の文字に置き換えなければならない。2つの文字が同じ文字に対応することはできないが、1つの文字がそれ自身に対応することは可能である。

Example 1:

Input: s = "egg", t = "add"
Output: true
Example 2:

Input: s = "foo", t = "bar"
Output: false
Example 3:

Input: s = "paper", t = "title"
Output: true

もっとわかりやすくいうと

abc -> def
はtrue

aac -> bbe
はtrue

でも
aac -> bce
はfalse
なぜならaはbとしてmapしているにもかかわらず次のaではcにmapされているから。
同じ文字は別の同じ文字に対応しないといけない

205. Isomorphic Strings 問題ページ

205. Isomorphic Strings

205. Isomorphic Strings

my code is time over.

    const map = {}
    if(s.length !== t.length) return false
    for(let i = 0; i < s.length; i++){
        if(map[s[i]] === undefined && map[map[t[i]]] === undefined){
            map[s[i]] = t[i]
            continue;
        }
        if(map[s[i]] && map[s[i]] != t[i] || map[map[t[i]]]){
            return false
        }
    }
    return true;

タイムオーバーで撃沈

205. Isomorphic Strings。discussの中の一つの解答例

数ある中からJavaScriptのもので、理解しやすい解説をピックアップしました。
discussから見ればさらにもっと違う方法で真似したくなるものがあるかもしれないですね

JavaScriptでfilterされている、discussはこちらから

205. Isomorphic Strings

  1. 一回のオブジェクト生成でやる方法
var isIsomorphic = function(s, t) {
    var obj = {};
    for(var i = 0; i < s.length; i++){
        if(!obj['s' + s[i]]) obj['s' + s[i]] = t[i]; // 接頭辞をkeyにしてsとtのkeyとして判別つける
        if(!obj['t' + t[i]]) obj['t' + t[i]] = s[i];
        if(t[i] != obj['s' + s[i]] || s[i] != obj['t' + t[i]]) return false;
    }
    return true;
};

2.

Fastest JavaScript Solution w/ Map & Set

const isIsomorphic = (s, t) => {
    let map = new Map(), set = new Set()
    for(let i = 0; i < s.length; i++){
        let sChar = s[i], tChar = t[i]
        if(map.has(sChar)){
            if(map.get(sChar) !== tChar)return false
        }else{
            if(set.has(tChar))return false
            map.set(sChar, tChar)
            set.add(tChar)
        }
    }
    return true
};

205. Isomorphic Stringsをやってみて感想

カテゴリー leetCode