LeetCode] [205の同形列(C ++インプリメンテーション)

二つの文字列が与えられ、ST彼らは同型であれば、判断します。

内の文字場合、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で再現

おすすめ

転載: blog.csdn.net/weixin_33672400/article/details/91916785