LeetCode [205 개 동형 문자열 (c ++ 구현)

두 개의 문자열을 감안할 때 ST 가 동형 경우, 결정한다.

의 문자 경우 두 문자열은 동형 의이 얻을 교체 할 수 있습니다 t을 .

문자의 순서를 유지하면서 캐릭터의 모든 사건은 다른 문자로 교체해야합니다. 두 개의 문자는 같은 문자에 매핑하지 않을 수 있지만, 캐릭터 자체에 매핑 할 수 있습니다.

예를 들어,
주어 "egg", "add"true를 돌려줍니다.

을 감안할 때 "foo", "bar", false를 돌려줍니다.

을 감안할 때 "paper", "title", true를 돌려줍니다.

참고 :
당신은 둘 다 가정 할 수 t 같은 길이를 갖는다.

이 항목에서는 키 시간을 최적화하는 방법이며, 시간 제한이 있습니다.

나는 두 사이클 후 시간 복잡도는 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;
    }
};

위의 방법은 시간의 복잡성을 줄일 필요가 작동하지 않습니다, 마지막으로, 나는 하나의 방법을 생각 : 두 개의 매개 변수를 숯불에 각주기에 대한 매핑의 <문자, 문자>지도를 사용하여, 우리는 대응 관계가 변경 발견하면, 다음 두 문자열의이 동형 수 없습니다. 시간 복잡도는 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