1. 程式人生 > >LeetCode 205. Isomorphic Strings

LeetCode 205. Isomorphic Strings

Given two strings s and t, determine if they are isomorphic.

Two strings are isomorphic if the characters in s can be replaced to get t.

All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.

Example 1:

Input: s = "egg", t = "add"
Output: true

Example 2:

Input: s = "foo", t = "bar"
Output: false

Example 3:

Input: s = "paper", t = "title"
Output: true

思路:

建一個map儲存對映關係, 同時用一個set儲存被對映的char, 保證同一個char 不會被對映兩次.

程式碼:

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        
        if(s.length() != t.length()) return false;
        
        map<char, char> map;
        set<char> set;
        
        for(int i=0, n=s.length(); i<n; i++) {
            char c1 = s[i];
            char c2 = t[i];
            
            if(map.find(c1) != map.end()) {
                if(map[c1] != c2) return false;
            } else {
                if(set.find(c2)!=set.end()) return false;
                else {
                    map[c1] = c2;
                    set.insert(c2);
                }
            }
        }
        return true;
    }
};

set用法:

set的特性是,所有元素都會根據元素的鍵值自動排序,set的元素不像map那樣可以同時擁有實值(value)和鍵值(key),set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素有相同的鍵值。

set的各成員函式列表如下:

1. begin()--返回指向第一個元素的迭代器

2. clear()--清除所有元素

3. count()--返回某個值元素的個數

4. empty()--如果集合為空,返回true

5. end()--返回指向最後一個元素的迭代器

6. equal_range()--返回集合中與給定值相等的上下限的兩個迭代器

7. erase()--刪除集合中的元素

8. find()--返回一個指向被查詢到元素的迭代器

9. get_allocator()--返回集合的分配器

10. insert()--在集合中插入元素

11. lower_bound()--返回指向大於(或等於)某值的第一個元素的迭代器

12. key_comp()--返回一個用於元素間值比較的函式

13. max_size()--返回集合能容納的元素的最大限值

14. rbegin()--返回指向集合中最後一個元素的反向迭代器

15. rend()--返回指向集合中第一個元素的反向迭代器

16. size()--集合中元素的數目

17. swap()--交換兩個集合變數

18. upper_bound()--返回大於某個值元素的迭代器

19. value_comp()--返回一個用於比較元素間的值的函式

Map用法:

 Map是c++的一個標準容器,她提供了很好一對一的關係,在一些程式中建立一個map可以起到事半功倍的效果,總結了一些map基本簡單實用的操作! 1. map最基本的建構函式;    map<string , int >mapstring;         map<int ,string >mapint;    map<sring, char>mapstring;         map< char ,string>mapchar;    map<char ,int>mapchar;            map<int ,char >mapint; 2. map新增資料;    map<int ,string> maplive;      1.maplive.insert(pair<int,string>(102,"aclive"));    2.maplive.insert(map<int,string>::value_type(321,"hai"));    3, maplive[112]="April";//map中最簡單最常用的插入新增! 3,map中元素的查詢:    find()函式返回一個迭代器指向鍵值為key的元素,如果沒找到就返回指向map尾部的迭代器。            map<int ,string >::iterator l_it;;     l_it=maplive.find(112);    if(l_it==maplive.end())                 cout<<"we do not find 112"<<endl;    else cout<<"wo find 112"<<endl; 4,map中元素的刪除:    如果刪除112;    map<int ,string >::iterator l_it;;    l_it=maplive.find(112);    if(l_it==maplive.end())         cout<<"we do not find 112"<<endl;    else  maplive.erase(l_it);  //delete 112; 5,map中 swap的用法:   Map中的swap不是一個容器中的元素交換,而是兩個容器交換;   For example:   #include <map>   #include <iostream>   using namespace std;   int main( )   {       map <int, int> m1, m2, m3;       map <int, int>::iterator m1_Iter;       m1.insert ( pair <int, int>  ( 1, 10 ) );       m1.insert ( pair <int, int>  ( 2, 20 ) );       m1.insert ( pair <int, int>  ( 3, 30 ) );       m2.insert ( pair <int, int>  ( 10, 100 ) );       m2.insert ( pair <int, int>  ( 20, 200 ) );       m3.insert ( pair <int, int>  ( 30, 300 ) );    cout << "The original map m1 is:";    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )       cout << " " << m1_Iter->second;       cout   << "." << endl;    // This is the member function version of swap    //m2 is said to be the argument map; m1 the target map    m1.swap( m2 );    cout << "After swapping with m2, map m1 is:";    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )       cout << " " << m1_Iter -> second;       cout  << "." << endl;    cout << "After swapping with m2, map m2 is:";    for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )       cout << " " << m1_Iter -> second;       cout  << "." << endl;    // This is the specialized template version of swap    swap( m1, m3 );    cout << "After swapping with m3, map m1 is:";    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )       cout << " " << m1_Iter -> second;       cout   << "." << endl; } 6.map的sort問題:   Map中的元素是自動按key升序排序,所以不能對map用sort函式:   For example:   #include <map>   #include <iostream>   using namespace std;  int main( )  {    map <int, int> m1;    map <int, int>::iterator m1_Iter;    m1.insert ( pair <int, int>  ( 1, 20 ) );    m1.insert ( pair <int, int>  ( 4, 40 ) );    m1.insert ( pair <int, int>  ( 3, 60 ) );    m1.insert ( pair <int, int>  ( 2, 50 ) );    m1.insert ( pair <int, int>  ( 6, 40 ) );    m1.insert ( pair <int, int>  ( 7, 30 ) );    cout << "The original map m1 is:"<<endl;    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )       cout <<  m1_Iter->first<<" "<<m1_Iter->second<<endl;    }   The original map m1 is:   1 20   2 50   3 60   4 40   6 40   7 30   請按任意鍵繼續. . . 7,   map的基本操作函式:       C++ Maps是一種關聯式容器,包含“關鍵字/值”對       begin()          返回指向map頭部的迭代器       clear()         刪除所有元素       count()          返回指定元素出現的次數       empty()          如果map為空則返回true       end()            返回指向map末尾的迭代器       equal_range()    返回特殊條目的迭代器對       erase()          刪除一個元素       find()           查詢一個元素       get_allocator()  返回map的配置器       insert()         插入元素       key_comp()       返回比較元素key的函式       lower_bound()    返回鍵值>=給定元素的第一個位置       max_size()       返回可以容納的最大元素個數       rbegin()         返回一個指向map尾部的逆向迭代器       rend()           返回一個指向map頭部的逆向迭代器       size()           返回map中元素的個數       swap()            交換兩個map       upper_bound()     返回鍵值>給定元素的第一個位置       value_comp()      返回比較元素value的函式