トピック
2 つの文字列 s
と が与えられた場合t
、それらが同型であるかどうかを判断します。
s
の文字を特定のマッピング関係に従って置き換えることができる 場合 t
、2 つの文字列は同形です。
文字が出現するたびに、文字の順序を変更せずに別の文字にマッピングする必要があります。異なる文字を同じ文字にマッピングすることはできません。同じ文字は同じ文字にのみマッピングでき、文字はそれ自体にマッピングできます。
例 1:
入力: s = "egg"、t = "add" 出力: true
例 2:
入力: s = "foo"、t = "bar" 出力: false
例 3:
入力: s = "論文"、t = "タイトル" 出力: true
C++ コード
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
/*
* 同构字符串的判断
* 使用两个无序哈希表保存映射关系
* 如果有映射关系但是值不同,返回false
*/
bool isIsomorphic(string s, string t) {
if (s.size() != t.size()) {
return false;
}
int len = s.size();
unordered_map<char, char> s2t;
unordered_map<char, char> t2s;
for (int i = 0; i < len; ++i) {
char x = s[i], y = t[i];
if ((s2t.count(x) && s2t[x] != y) || (t2s.count(y) && t2s[y] != x)) {
return false;
}
s2t[x] = y;
t2s[y] = x;
}
return true;
}
int main() {
string s = "egg";
string t = "add";
bool ans = isIsomorphic(s, t);
cout << boolalpha << ans << endl;
return 0;
}
分析する
同型文字列を判定するには、2 つの順序なしハッシュ テーブルを使用してマッピング関係を保存し、マッピング関係があるが値が異なる場合は false を返し、それ以外の場合は true を返します。