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.

For example,
Given "egg""add", return true.

Given "foo""bar", return false.

Given "paper""title", return true.

Note:
You may assume both s and t have the same length.

分析:同构字符串必须满足,s字符串中相同的字符对应t字符串中相同的字符,s字符串中不同的字符对应t字符串中不同的字符。

代码如下:

class Solution {
public:
bool isIsomorphic(string s, string t) {
char map_s[128] = { 0 };
char map_t[128] = { 0 };
int len = s.size();
for (int i = 0; i < len; ++i)
{
if (map_s[s[i]]!=map_t[t[i]]) return false;
map_s[s[i]] = i+1;
map_t[t[i]] = i+1;
}
return true;
}
};

可参考解法:

记录遍历s的每一个字母,并且记录s[i]到t[i]的映射,当发现与已有的映射不同时,说明无法同构,直接return false。然后交换s和t的位置再重来一遍,这样保证s和t之间的双向映射。

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

题意为 判断一个字符串中是否可以由另一个字符串中的字符替换而来。

如果直接尝试替换的话实现比较麻烦,可以对两个字符串分解进行转换,看转换后的结果是否一致。 

依次用‘0’, ‘1‘...替换字符串出现的字符,如 ’abbc‘可以替换为’0112‘。需要设置一张转换表,记录转换后每个字符对应的替代字符:

class Solution {
public:
string transferStr(string s){
char table[128] = {0};
char tmp = '0';
for (int i=0; i<s.length(); i++) {
char c = s.at(i);
if (table[c] == 0) {
table[c] = tmp++;
}
s[i] = table[c];
}
return s;
}
bool isIsomorphic(string s, string t) { if (s.length() != t.length()) {
return false;
}
if (transferStr(s) == transferStr(t)) {
return true;
}
return false;
}
};

其他:

class Solution {
public:
bool isIsomorphic(string s, string t)
{
const size_t n = s.size();
if ( n != t.size())
return false; unsigned char forward_map[256] = {}, reverse_map[256] = {}; for ( int i=0; i < n; ++i)
{
unsigned char c1 = s[i];
unsigned char c2 = t[i]; if ( forward_map[c1] && forward_map[c1] != c2)
return false; if ( reverse_map[c2] && reverse_map[c2] != c1)
return false; forward_map[c1] = c2;
reverse_map[c2] = c1;
} return true;
}
};

3 lines 3ms C solution

bool isIsomorphic(char* s, char* t) {
static char n[512],*m = n + 256;
return (!*s && !*t && memset(n,0,512)) || (((!(m[*s] || n[*t] || !(m[*s] = *t, n[*t] = *s)) ||
(m[*s] == *t && n[*t] == *s)) || !memset(n,0,512)) && isIsomorphic(s+1,t+1)); }

3ms O(n) C solution:The idea is to use two arrays to store the mappings between corresponding characters of s and t.

bool isIsomorphic(char* s, char* t) {
char map[256], rmap[256]; memset(map, 0, sizeof map);
memset(rmap, 0, sizeof rmap);
for ( ; *s; ++s, ++t)
if (!map[*s]) {
if (rmap[*t]) // another character already maps to *t
return false; map[*s] = *t;
rmap[*t] = *s;
} else if (map[*s] != *t)
return false; return true;
}

  

  

  

leetcode:Isomorphic Strings的更多相关文章

  1. [leetcode]205. Isomorphic Strings 同构字符串

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

  2. LeetCode之“散列表”:Isomorphic Strings

    题目链接 题目要求: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic i ...

  3. LeetCode OJ:Isomorphic Strings(同构字符串)

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

  4. LeetCode 205. Isomorphic Strings (同构字符串)

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

  5. LeetCode 205 Isomorphic Strings

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

  6. 【leetcode】Isomorphic Strings

    题目简述: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ...

  7. Java for LeetCode 205 Isomorphic Strings

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

  8. 【leetcode】Isomorphic Strings(easy)

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

  9. (easy)LeetCode 205.Isomorphic Strings (*)

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

随机推荐

  1. SQLSERVER中WITH(NOLOCK)详解

    在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST .有关 NOLOCK 和 READPAST的一些技术知识 ...

  2. [百度空间] --whole-archive & --no-whole-archive

    What is it? backgorund: an archive file (.a) is similar as .lib compared to Winodws. it simply conta ...

  3. 企业级账号更新app

    企业级账号 版本更新总结       参考:http://jingyan.baidu.com/article/a3aad71aa5fbfbb1fb0096b1.html 1.打包ipa,plist工具 ...

  4. MySQL复制中slave延迟监控

    在MySQL复制环境中,我们通常只根据 Seconds_Behind_Master 的值来判断SLAVE的延迟.这么做大部分情况下尚可接受,但并不够准确,而应该考虑更多因素. 首先,我们先看下SLAV ...

  5. javascript实现数据结构与算法系列:线性表的静态单链表存储结构

    有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...

  6. 接口、抽象类、方法复写、类Equals方法重写

    接口: /* * Java接口中的數據成員必須初始化,該成員有隱藏的final.satic.常量, * 一次賦值后不可在賦值 * 成員方法訪問修飾符必須是公共修飾符,可以顯示聲明也可以不聲明 * 成員 ...

  7. Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)

    第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要 ...

  8. codeforces 439C Devu and Partitioning of the Array(烦死人的多情况的模拟)

    题目 //这是一道有n多情况的烦死人的让我错了n遍的模拟题 #include<iostream> #include<algorithm> #include<stdio.h ...

  9. Wamp Mysql错误消息 语言设置

    Wamp Mysql错误消息 语言设置 http://my.oschina.net/wandershi/blog/264347 打开my.ini   找到 [wampmysqld] port = 33 ...

  10. C# 与C/C++相互调用

    C++调用C#的DLLhttp://www.csharpwin.com/csharpspace/11385r8940.shtml C#调用C/C++动态库必须注意的几个问题http://www.rob ...