二つの文字列が与えられ、SとT彼らは同型であれば、判断します。
内の文字場合、2つの文字列が同型でsが取得するために交換することができますトンを。
文字の順序を維持しながら、文字のすべてのオカレンスは、別の文字に置き換える必要があります。どの2つの文字は、同じ文字にマッピングしないかもしれませんが、文字はそれ自体にマッピングすることができます。
例えば、
与えられた"egg"
、"add"
真を返します。
与えられた"foo"
、"bar"
falseを返します。
与えられた"paper"
、"title"
真を返します。
注意:
あなたは両方取ることができるのとtは同じ長さを持っています。
このトピックでは、キーは時間を最適化する方法で、時間制限があります。
私はそれが「時間制限を超過」だったので、2サイクル、複雑さがn乗され、その後の時間のためであるが、それはテストケースを持って、二つの文字列特に長い練習を始めました。コードは以下の通りであります:
class Solution {
public:
bool isIsomorphic(string s, string t) {
int len = s.length();// 时间复杂度n平方,不满足题目要求。
for (size_t i = 0; i < len; i++) {
for (size_t j = i + 1; j < s.length(); j++) {
if ((s[i] == s[j] && t[i] != t[j]) || (s[i] != s[j] && t[i] == t[j])) {
return false;
}
}
}
return true;
}
};
上記の方法がうまくいかない、時間の複雑さを低減する必要がある、最終的には、私は1つの方法だと思う:、我々は対応関係が変更されている見つけた場合、文字に、各サイクルのマッピングの<CHAR、CHAR>マップ、2つのパラメータを使用しますその後、二つの文字列のことは同型ではありません。時間計算量はO(n)は、次のコードです。
class Solution {public:bool isIsomorphic(string s, string t) {int len = s.length();
map<char, char> m;
map<char, char> m2;for (size_t i = 0; i < len; i++) {if (m.find(s[i]) == m.end()) {
m[s[i]] = t[i];
}else if (m[s[i]] != t[i]) {
return false;
}if (m2.find(t[i]) == m2.end()) {
m2[t[i]] = s[i];
}else if (m2[t[i]] != s[i]) {
return false;
}
}
return true;
}
};
ます。https://my.oschina.net/styshoo/blog/546674で再現