[leetcode]問題解答と解説。205. Isomorphic Strings [JavaScript]
皆さんleetCode好きですよね。私も好きです。
なかなかやる機会がないのですよね。
私はある決意をして今臨んでいます。
モチベーションを保つためだけにこれをやっています。
では今日のleetCode。
「205. Isomorphic Strings」の解決策と方法。自分がまず挑戦して
やったことをさらけ出します。
※下にある自分のコードは自分で設けた制限時間内に書けたところまです。
これは
「私は年末までこれを続けたらどんなleetCoderになるか」のシリーズ。
実験的ブログ更新です。
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
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はこちらから
- 一回のオブジェクト生成でやる方法
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
};