如何找到两个字符串是否同构

How do I find if two strings is isomorphic of not?

本文关键字:两个 字符串 是否 同构 何找      更新时间:2023-10-16
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool is_isomorphic(string input1, string input2)
{
    if(input1.length()!= input2.length())
        return  false;
    vector<int> diff_arr(26, -40);//Initialise with some random value.
    for(int  i = 0 ; i < input1.length(); i++){
        if(diff_arr[input1[i]-'a'] == -40)
            diff_arr[input1[i]-'a'] = input1[i] - input2[i];
        else{
            if(diff_arr[input1[i]-'a'] != input1[i] - input2[i])
                return false;
        }
    }
    return true;
}
int main() {
    cout<<is_isomorphic("abcd", "aabb");
    return 0;
}

我的逻辑是,如果字符可以在第二个字符串中替换为完全相同的字符,那么字符差异必须始终相同。

在上述情况下,逻辑失败。

您还需要检查input1中的两个字符是否未映射到input2中的同一字符。

#include <iostream>
#include <string>
#include <map>
#include <set>
using namespace std;
bool is_isomorphic(string input1, string input2)
{
    if(input1.length()!= input2.length())
        return  false;
    set<char> usedLetters;
    map<char, char> transformations;
    for(int i = 0 ; i < input1.length(); i++) {
        auto iter = transformations.find(input1[i]);
        if (iter != transformations.end()) {
            if (iter->second == input2[i]) continue;
            else return false;
        }
        if (usedLetters.count(input2[i])) return false;
        usedLetters.insert(input2[i]);
        transformations[input1[i]] = input2[i];
    }
    return true;
}
int main() {
    cout<<is_isomorphic("abcd", "aabb");
    return 0;
}

您需要 2 个数组,一个用于知道 input2 的哪个字符对应于 input1 的给定字符,另一个用于检查 input2 的字符是否尚未影响 input1 的字符。

#include <iostream>
#include <string>
using namespace std;
bool is_isomorphic(const string& input1, const string& input2)
{
    if (input1.length() != input2.length()) {
        return false;
    }
    char map[256]{};
    bool used[256]{};
    for (size_t i = 0; i < input1.length(); i++) {
        unsigned char val1 = input1[i];
        if (!map[val1]) {
            unsigned char val2 = input2[i];
            if (used[val2]) {
                return false;
            }
            map[val1] = input2[i];
            used[val2] = true;
        } else
        if (map[val1] != input2[i]) {
            return false;
        }
    }
    return true;
}
int main() {
    cout << is_isomorphic("abcd", "aabb") << endl;
    cout << is_isomorphic("abcdb", "zerte") << endl;
    return 0;
}